Zur Navigation

RegEx: Session-ID an Links von eigener Domain anhängen

1 C)-(iLL@

Hallo,

ich bin immer noch kein sonderlicher Experte im Umgang mit regulären Ausdrücken, aber ich lerne hart :) Nachdem ich nun schon eine lange Zeit vor diesem Problem verbracht und geärgert habe, bitte ich um Hilfe. bitte bitte.

Es geht darum, in html-Text die Session-ID an Links dranzuhängen, die auf innerhalb der eigenen Domain eines gewissen Verzeichnisses verweisen (im Beispiel 'domain.com/prog/'), aber nur an die.

$text = '<h1>Session anhängen:</h1>
<p><a id="a" href="http://domain.com/prog/bla.html"><strong>Bla</strong></a></p>
<p><a href="http://www.domain.com/prog/blaa.html"><strong>Blaa</strong></a></p>
<p><a href="http://sub.domain.com/prog/blala.html?id=2"><strong>Blala</strong></a></p>
<p><a href="https://domain.com/prog/blabla.html?id=2&id2=3"><strong>Blabla</strong></a></p>
<p><a href="/prog/blubblu.html"><strong>Blubb</strong></a></p>
<p><a href="blubbu.html"><strong>Blubb</strong></a></p>
<h1>Session NICHT anhängen:</h1>
<p><a href="http://anderedomain.com/prog/index.html"><strong>Bla</strong></a></p>
<p><a href="https://anderedomain.com/maeh/index.html"><strong>Bla</strong></a></p>
<p><a href="ftp://domain.com/blala.html"></a></p>'

So weit bin ich inzwischen:

Suchregex:
/(<a[^>]+href="((http|https)\://(.+)?.?domain.com/prog/|/prog/)([^"]*))/ixg
Ersetzung:
$1?sid=12345
Leider haut das nicht hin, es wird der Link auf 'anderedomain.com/prog/' auch ersetzt, und der Link ohne Verzeichnis (href="blubbu.html') wird nicht aufgenommen, weil ich nicht weiß, wie ich dem Suchstring beibringe, auf Links ohne / am Anfang zu reagieren (*Kopf gegen den Monitor stoß*)

Die bereits vorhandenen Parameter sind ebenfalls ein Problem - es müsste dann & anstatt ? verwendet werden. Kann man das überhaupt mit einem preg_replace lösen oder braucht man da bereits ein callback?

Vielen Dank für Tips in die richtige Richtung,
Rudy

12.03.2006 01:40

2 Jörg Kruse

Hallo Rudy,

'anderedomain.com/prog/' könntest du mit einem '(.+\.)?' direkt vor 'domain.com' ausschließen:

$text = preg_replace('/(<a[^>]+href="((http|https)\:\/\/(.+\.)?domain.com\/prog\/|\/prog\/)([^"]*))/ix', '$1?sid=12345', $text);

der Link ohne Verzeichnis (href="blubbu.html') wird nicht aufgenommen, weil ich nicht weiß, wie ich dem Suchstring beibringe, auf Links ohne / am Anfang zu reagieren

vielleicht eine zweite Regex dahinterschalten, die alles ausschließt, was ein '/' aufweist?

12.03.2006 08:55 | geändert: 12.03.2006 08:58

3 C)-(iLL@

Jörg, mein Retter ;)

(.+\.)
Ach da war der Fehler... omg, wie dumm! Danke!!

vielleicht eine zweite Regex dahinterschalten, die alles ausschließt, was ein '/' aufweist?
Gut, das werde ich versuchen. Vielen Dank! Wenns fertig ist stell ichs rein, vielleicht braucht das ja mal jemand.

12.03.2006 11:46

4 C)-(iLL@

Soooooo.... endlich fertig! Ist ein Monster geworden... ;)

Teststring:
$test = '<h1>Session anhängen:</h1>
<p><a id="a" href="http://domain.com/prog/bla.html"><strong>Bla</strong></a></p>
<p><a href="http://www.domain.com/prog/blaa.html"><strong>Blaa</strong></a></p>
<p><a href="http://sub.domain.com/prog/blala.html?id=2"><strong>Blala</strong></a></p>
<p><a href="https://domain.com/prog/blabla.html?id=2&amp;id2=3"><strong>Blabla</strong></a></p>
<p><a href="/prog/blubblu.html"><strong>Blubb</strong></a></p>
<p><a href="sub/blubbu.html"><strong>Blubb</strong></a></p>
<p><a href="blubbu.html"><strong>Blubb</strong></a></p>
<p><a href="hallo/blubbu.html?jep=1"><strong>Blubb</strong></a></p>
<h1>Session NICHT anhängen:</h1>
<p><a href="/hallo/blubbu.html?jep=1"><strong>Blubb</strong></a></p>
<p><a href="http://anderedomain.com/prog/index.html"><strong>Bla</strong></a></p>
<p><a href="https://anderedomain.com/maeh/index.html"><strong>Bla</strong></a></p>
<p><a href="ftp://domain.com/blala.html"></a></p>'; 
Funktion:
function scansid ($text, $domain, $basefolder){

  function addsid($match) {
    $glue = strpos($match[0], '?') === FALSE ? '?' : '&amp;';
	  return $match[0].$glue.session_name().'='.session_id();
  }

  return preg_replace_callback(',<a(?:[^>]+)href="(?:(?!https?://|ftp://|mailto:|news:|/)|(?:(?:https?\://(?:.+\.)?'.$domain.')?'.$basefolder.'))(?:[^>"\s]+),ix', 'addsid', $text);
}
echo scansid($test, 'domain.com', '/prog/');

Vielleicht hilfts jemandem - oder entdeckt gar wer einen Fehler? Für Verbesserungen bin ich immer offen.

12.03.2006 13:31

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]