Seite 1 von 1

Frage zu preg_replace

Verfasst: 18.03.2005 20:21
von Seether
Leider habe ich große Schwierigkeiten im Umgang mit der Pattern Syntax.

Es geht um den konkreten Fall, dass ich wie es phpbb macht URLs klickbar machen möchte, aber nicht, falls bestimmte Domains drin vorkommen.

Wenn ich micht nicht täusche wandelt das hier urls im Format xxxx://yyyy in klickbare links um
$ret = preg_replace("#(^|[\n ])([\w]+?://[^ \"\n\r\t<]*)#is", "\\1<a href=\"\\2\" target=\"_blank\" class=\"forum2\">\\2</a>", $ret);
Was müsste ich jetzt einfügen, dass es nicht gemacht werden soll wenn die domain seite.de drin enthalten ist?


S.

Verfasst: 19.03.2005 01:35
von Pyramide
Wenn ich die [php=pcre.pattern.syntax#regexp.reference.assertions]Doku[/php] richtig verstehe, müsste das mit einer "negative lookahead assertion" funktionieren:

Code: Alles auswählen

$ret = preg_replace("#(^|[\n ])([\w]+?://(?!www\\.seite\\.de)[^ \"\n\r\t<]*)#is", "\\1<a href=\"\\2\" target=\"_blank\" class=\"forum2\">\\2</a>", $ret);
(ungetestet)

Verfasst: 19.03.2005 12:36
von Seether
Ui, das echt ein wenig zu hoch für mich im Moment.

Wie wäre denn dann das Gegenteil davon? Also, dass nur Links umgewandelt werden in denen seite.de als Domain drin vorkommt?


S.

Verfasst: 19.03.2005 13:35
von Blutgerinsel
ungetestet:

Code: Alles auswählen

$neuerstring=preg_replace('#(http[s]?://[w]{3}\.blubb\.de(.*)$)#is','<a href="\1">\1</a>',$quellstring);
Der Domain Name muss maskiert werden da würde denke ich preg_quote(); gute Dienste tun.

Auch ist preg_replace besser durch preg_replace_callback auszutauschen um keine unschönen langen Url zu generieren und diese mit Punkten etc. zu kürzen aber dazu bedarf es einer eigenen geschriebenen Funktion. Nur um die Ersetzungsfunktion durch den regulären Ausdruck anzustossen halte ich preg_replace_callback für die bessere Wahl :wink: