EisFuX: Reg expr: Wie erfasse ich URLs im Fließtext?

Beitrag lesen

Hi Gerd,

ich möchte eine oder auch mehrere URLs aus einem eingelesenen Fließtext (html) erfassen, ich habs hiermit versucht, aber das hat nicht so funktioniert, wie ich wollte:

$pattern = "<a(.*)href=[^>]*>(.*)</a>";

Dabei dachte ich, $pattern beschreibt einen Ausdruck <a(mit eventuellem weiterem Text)href=[und zwar nicht >]und nochmal eventuelle Zeichen, gefolgt von >, dann wieder Zeichen und zum Schluß </a>.

Womit dann bspw. <a href="http://www.domain.de/blabla/datei.html">Link</a> vollständig erfasst sein sollte.

Ist aber in der Praxis so, daß über </a> hinaus erfasst wird.

'<a(.*)' - erfasst nach "<" und "a" eine beliebige Zahl (nahezu) beliebiger Zeichen, und da PCRE von Natur aus gierig sind, nehmen sie immer die längste passende Zeichenkette, die sie finden können. Steht also im HTML-Quelltext hinter dem
<a href="">...
noch eins, dann wird das miterfasst.

Ich würde das besser so machen (PCRE):

  
preg_match_all(  
  '/\<a\s+href=([\"\']?)([^>]*)\1\s*\>([^<]*)\<\/a\>/',  
  $haystack,  
  $rx_matches  
);  
print_r($rx_matches);  

Das dürfte die Fälle abdecken, in denen außer dem href-Attribut kein weiteres vorkommt.

MffG
EisFuX

--
... Suchmaschinen-Blog ...