badger
Goto Top

Regex: auto link

Hallo Leute,

mittels folgenden Code durchsuche ich einen String und erzeuge klickbare Links:
$url = '@(http(s)?)?(://)?(([a-zA-Z])([-\w]+\.)+([^\s\.]+[^\s]*)+[^,.\s])@';  
$content = preg_replace($url, '<a href="http$2://$4" title="$0">$0</a>', $content);  

Den Code selbst habe ich nach einiger Suche im www gefunden.

Nun aber folgendes Problem: wenn im String bereits ein klickbarer Link (<a ......>) vorhanden ist, setzt er davor nochmal ein <a ...>, da der Code nicht prüft, ob der Link "Text" ist oder schon ein Anchor.
Leider bin ich nicht 1000% fit mit Regex und meine Versuche das Problem zu lösen sind bisher gescheitert.

Hat wer eine Idee bzw. einen Ansatz für mich?

Besten Dank für eure Hilfe
Patrick

Content-ID: 368947

Url: https://administrator.de/forum/regex-auto-link-368947.html

Ausgedruckt am: 05.02.2025 um 19:02 Uhr

135799
135799 22.03.2018 aktualisiert um 17:53:39 Uhr
Goto Top
Machs z.B. mit einem negative lookbehind
$url = '@(?<!href=["\'])https?://(([a-zA-Z])([-\w]+\.)+([^\s\.]+[^\s]*)+[^,.\s])@i';  
$content = preg_replace($url,'<a href="$0">$0</a>',$content);  
Schnuffi
Badger
Badger 23.03.2018 um 09:10:46 Uhr
Goto Top
Danke für den Tipp. Leider hat das bei mir nicht ganz fehlerfrei funktioniert.
Folgendes hat nun mein Problem gelöst:

$url = '@(?:http([s]?):\/\/)?(([a-zA-Z0-9-]+[.])+[a-zA-Z0-9-]+(\/[a-zA-Z0-9-]*)*(\?[^\s]*)*)(?![^\s]*>)@i';	  
$content = preg_replace($url, '<a href="$0" title="$0">$0</a>', $content);  

Grüße
Patrick
135799
135799 23.03.2018 aktualisiert um 09:36:08 Uhr
Goto Top
Doch wurde getestet, dein Regex verhindert nicht effektiv das es Verschachtelungen geben kann, aber wat Solls, kennt ja keiner hier deine Source ...
Badger
Badger 23.03.2018 um 09:41:10 Uhr
Goto Top
Jetzt weiß ich, warum deiner "nicht funktioniert": es wird zwingend ein http(s) erfordert vor dem link (und das habe ich bei meinen Tests nicht gemacht).
Danke.

Schön langsam verstehe ich, warum das viele CMS nicht im Standard haben: so extrem viele Fälle sind zu berücksichtigen (mit http(s) und ohne, ist bereits ein Link oder nicht,...)