Hallo Jörg,
für das, was die von Dir gezeigte Codezeile tut, scheint mir ein regex-Replace eine sehr ungeeignete Lösung zu sein.
Und dieser Satz
Ich kann Dir auch nicht erklären, was welche Stelle in miener Regex macht oder machen soll.
ärgert mich. Es ist also nicht deine Regex. Du hast sie irgendwoher kopiert. Vermutlich zusammen mit dem Replace-Ausdruck. Letztendlich geht es Dir doch darum, aus $text einen Link zu machen, falls in $text eine URL steht.
Eine bessere Lösung wäre diese Funktion, die ich als Pseudocode aufgeschrieben habe. PHP daraus machen ist deine Hausaufgabe 😉. Eine Funktion deshalb, damit man Schritt für Schritt die erforderlichen Prüfungen ausführen kann und aussteigt, wenn eine fehlschlägt. Das vermeidet ein Einrückungsgebirge.
function create_link_for_text($text)
{
if (!($text ist gültige URL))
return $text;
$teile = parse-url($text);
if (!(schema ist zulässig))
return $text;
if (host enthält youtube)
return $text;
$url = urlencode($text);
return "<a href='dereferscript.php?target1=" .
urlencode($text) .
"' target='_blank'>" .
htmlspecialchars($text) .
"</a>";
}
Die Prüfung, ob $text eine gültige URL enthält, gelingt mit filter_var($text, FILTER_VALIDATE_URL)
. Allerdings lässt das auch Schemata zu, die Du nicht willst.
Deswegen folgt als nächstes die Zerlegung der URL in ihre Teile, dafür hat PHP die Funktion parse_url. Die liefert Dir ein assoziatives Array mit den Einzelteilen der URL, aber sie validiert nicht, ob Du ihr eine gültige URL gibst. Deswegen vorher die Prüfung mit filter_var.
Das $teile-Array hat Schlüssel für die einzelnen URL-Teile. Deren Namen stecken in PHP-Konstanten; du brauchst PHP_URL_SCHEME und PHP_URL_HOST. Damit musst Du prüfen, ob das Schema ftp, http oder https ist. Wenn nicht - kein Link. Und dann musst Du prüfen, ob der Host auf youtube.de, youtube.com oder youtu.be endet. Wenn ja, kein Link.
Ist alles gelungen, folgen zwei Dinge, die Du vergessen hattest: die URL, die Du übergeben willst, muss mit urlencode codiert werden. Und der Linktext muss mit htmlspecialchars behandelt werden.
Das Ergebnis der Funktion ist dann entweder das HTML Fragment mit dem Link, oder der unveränderte Eingabetext.
Wie man filter_var und parse_url einbaut, findest Du sicher selbst heraus. Die Dokumentationsseiten habe ich Dir verlinkt - Dokulesen gehört zwar zu den okkulten Künsten, aber es lohnt, diese Kunst zu erlernen. Und dann weißt Du auch, was die Funktion tut und brauchst keine rätselhaften Regechsen zu jagen.
Das Ergebnis ist dann zwar kein Einzeiler mehr. Aber das macht nichts. Einzeiler sind nicht zwangsläufig die bessere Lösung. Dieser Mehrzeiler ist besser lesbar und tut vor allem viel mehr, und sinnvolleres.
Rolf
sumpsi - posui - obstruxi