suit: Regulärer Ausdruck zum Finden von href-Attributen finden

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?  
  

  1. 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

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    Der Valigator leibt diese Fische
    1. 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 ;)

  2. 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

  3. @@suit:

    nuqneH

    ich benötige einen regulären Ausdruck (PCRE) der den Inhalt von href-Attributen in einem XHTML-Quelltext findet.

    Zitat 1418

    Wie wär’s denn, zur Verarbeitung von X(HT)ML was zu nutzen, was dafür gedacht ist? Bspw. XSLT.

    Qapla'

    --
    Alle Menschen sind klug. Die einen vorher, die anderen nachher. (John Steinbeck)
    1. Zitat 1418

      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