Hi,
ich wollte meine Linkerkennung noch mal überarbeiten und etwas kompakter gestalten. Da bin ich auf diese Variante gekommen:
Dabei kann ich mir nicht erklären, warum domain2.de nicht verlinkt wird. Es wirkt, als würde das auf die URL folgende Space durch den vorherigen Patterndurchlauf reserviert. Kann ich das irgendwie verhindern / umgehen?
Was ich dann wieder faszinierend finde ist, dass das auch nicht geht:
Ich kann also weder auf den Anfang der Zeile zugreifen, noch auf das "e" aus ".de" oder das "w" aus "www", noch auf Spaces. Rein gar nichts greifbar.
Lasse ich den Pattern auf dem "e" enden, dann läuft er durch (nur ohne das "e"
):
So als bräuchte der Durchlauf ein Zeichen Platz um zu funktionieren ?!
Das bestätigt auch die Tatsache, dass ich mit dem String alles verlinkt bekomme (zwei Leerzeichen zwischen den URLs):
EDIT:
Hmm ich glaube ich verstehe die Logik. Der Pattern sucht nicht quasi in einer Schleife, sondern der zerlegt den ganzen String auf einmal mit dem übergebenen Filter. Hmm.. blöd. Dann muss ich doch mit Stoppzeichen arbeiten.
EDIT2:
Doch nicht. Geht auch einfacher. Vor lauter Bäumen...
ich wollte meine Linkerkennung noch mal überarbeiten und etwas kompakter gestalten. Da bin ich auf diese Variante gekommen:
PHP-Code:
<?php
$post_input = 'www.domain1.de www.domain2.de www.domain3.de';
$text = ' ' . htmlspecialchars($post_input, ENT_QUOTES, 'UTF-8') . ' ';
$text = preg_replace('#([[:space:]])((?>(?>ht|f)tps?://|www\.)[^[:space:]]+?)([[:space:]])#i', '$1<a href="$2" target="_blank">$2</a>$3', $text);
echo $text;
?>
Was ich dann wieder faszinierend finde ist, dass das auch nicht geht:
PHP-Code:
'#(^|[[:space:]e])((?>(?>ht|f)tps?://|www\.)[^[:space:]]+?)([[:space:]w])#i'
Lasse ich den Pattern auf dem "e" enden, dann läuft er durch (nur ohne das "e"

PHP-Code:
'#([[:space:]])((?>(?>ht|f)tps?://|www\.)[^[:space:]]+?)([[:space:]e])#i'
Das bestätigt auch die Tatsache, dass ich mit dem String alles verlinkt bekomme (zwei Leerzeichen zwischen den URLs):
PHP-Code:
$post_input = 'www.domain1.de www.domain2.de www.domain3.de';
Hmm ich glaube ich verstehe die Logik. Der Pattern sucht nicht quasi in einer Schleife, sondern der zerlegt den ganzen String auf einmal mit dem übergebenen Filter. Hmm.. blöd. Dann muss ich doch mit Stoppzeichen arbeiten.
EDIT2:
Doch nicht. Geht auch einfacher. Vor lauter Bäumen...
PHP-Code:
'#([[:space:]])((?>(?>ht|f)tps?://|www\.)[^[:space:]]+)#i'