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-Key: 368947

Url: https://administrator.de/contentid/368947

Printed on: April 21, 2024 at 02:04 o'clock

Mitglied: 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
Member: 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
Mitglied: 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 ...
Member: 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,...)