Regulärer Ausdruck zum Finden von href-Attributen finden
suit
- php
0 Beat0 suit
0 suit0 Gunnar Bittersmann0 suit
Tach,
ich benötige einen regulären Ausdruck (PCRE) der den Inhalt von href-Attributen in einem XHTML-Quelltext findet. Zum Einsatz kommt preg_match_all(). Genauer gesagt sollen sämtlichen Ressourcen (intern wie extern gefunden werden - also alle Attribute die einen URI beinhalten) - wenn ich jetzt nix vergessen habe, sollte ich das mit folgenden abgedeckt sein:
src, href, longdesc, cite, classid, codebase, data, action, background und profile
Der Ausdruck soll den Inhalt ohne ggf. vorhandene Leerzeichen am Anfang oder Ende liefern.
<img src="http://example.com/" alt="" />
sollte damit genauso abgedeckt sein wie
<img src
= " http://example.com/ " alt="" />
~~~ - sprich unschöne tipperein die man wohl eher selten im Quelltext so findet, aber durchaus gültig sind
Aktuell hab' ich folgendes (Attribute sind vorerst drei drin) und es scheint zu funktionieren:
/(?:href|src|londesc)\s\*=\s\*"\s\*?(.+)\s\*"/U
Den i-Modifikator hab' ich gespart weil die Attribute ohnehin gleich geschrieben sein müssen.
Frage nun: hab' ich irgendetwas übersehen oder gibt's Verbesserungsvorschläge?
Aktuell hab' ich folgendes (Attribute sind vorerst drei drin) und es scheint zu funktionieren:
/(?:href|src|londesc)\s*=\s*"\s*?(.+)\s*"/U
/\b(?:href|src|londesc)\s*=\s*"\s*(.*?)\s*"/
hier sollst du gierig sein ^ ^ hier sparsam
Eine leerer value ist auch ein url!
Frage nun: hab' ich irgendetwas übersehen oder gibt's Verbesserungsvorschläge?
Ja streng genommen wird hier nicht in xhtml Tags gesucht, sondern irgendwo im Text.
Die Frage was innerhalb [CDATA[ ]] geschehen soll, ist nicht geklärt.
Mache dich schlau zum Thema XHTML Parser in php.
mfg Beat
Eine leerer value ist auch ein url!
Ja, der soll aber dann so bleiben wie er ist - da wäre ohnehin keine Änderung notwenig.
Ja streng genommen wird hier nicht in xhtml Tags gesucht, sondern irgendwo im Text.
Ansich hast du recht
Die Frage was innerhalb [CDATA[ ]] geschehen soll, ist nicht geklärt.
Daran hab ich garnicht gedacht - siehst du. Das soll unberührt bleiben.
Mache dich schlau zum Thema XHTML Parser in php.
Einen XML-Parser meinst du wohl - den wollte ich dafür nicht anwerfen, ist aber sicher die schlauere Idee. Es geht um das Reparsing einer durch ein CMS generierten Seite - das CMS ist leider nicht so der renner, aber der Code muss ordentlich sein - ich wollte mich da eigentlich mit einem eleganten 1-Zeiler reinhängen ;)
Nachtrag: Anforderung hat sich erweitert - ich möchte nun NUR Einträge finden die nach den optionalen Whitespaces am Anfang des Attributs keinen bestimmten string zu beginn haben - sprich einige interne Links auf bestimmte Unterverzeichnisse ausschließen
Der Ausdruck sieht aktuell so aus:
/(action|background|cite|classid|codebase|data|href|longdesc|profile|src)\s*=\s*"\s*?(?!dir1|dir2)(.+)\s*"/U
Hier scheitere ich allerdings mit meinem Verständnis - bei der lookahead assertion stimmt etwas nicht
<a href="dir1/foobar" />
<a href=" dir2/foobar" />
<a href=" dir3/foobar" />
<a href="dir4/foobar" />
dir2, 3 und 4 werden gefunden obowhl eigentlich nur 3 und 4 gefunden werden sollen (weil ja dir1 und dir2 der beliebigen zeichenkette nicht vorangehen dürfen
@@suit:
nuqneH
ich benötige einen regulären Ausdruck (PCRE) der den Inhalt von href-Attributen in einem XHTML-Quelltext findet.
Wie wär’s denn, zur Verarbeitung von X(HT)ML was zu nutzen, was dafür gedacht ist? Bspw. XSLT.
Qapla'
Kommt mir bekannt vor :p
Wie wär’s denn, zur Verarbeitung von X(HT)ML was zu nutzen, was dafür gedacht ist? Bspw. XSLT.
Ich nutze mittlerweile die DOM-Extension von PHP und nur einen sehr bemessenen regulären Ausdruck zum Entfernen von Trailing Slashes
/(?:/$|/?|/#)/U
Das ganze passiert nur noch in einem durch die DOM-Funktionen start eingeschränkten Teil und sollte dort ansich alles abdecken was in meinem Fall vorkommen kann:
example.com/foo/ -> example.com/foo
example.com/foo/?bar=baz -> example.com/foo?bar=baz
example.com/foo/#bar -> example.com/foo#bar
example.com/foo/?bar=baz#qux -> example.com/foo?bar=baz#qux