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

Printed on: January 23, 2025 at 17:01 o'clock

135799
135799 Mar 22, 2018 updated at 16:53:39 (UTC)
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 Mar 23, 2018 at 08:10:46 (UTC)
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 Mar 23, 2018 updated at 08:36:08 (UTC)
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 Mar 23, 2018 at 08:41:10 (UTC)
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,...)