molleonline: RegEx Problem

Hallo,

ich versuche ein HTML Dokument mit RegEx zu parsen und stoße gerade auf folgendes Problem:
wie schaffe ich es, dass beim String

<test><test><test>x
<test><value>x

und der RegEx /><(.+?)>x/ims
nur value gefunden wird und nicht test><test und value?

Das Problem ist nämlich, dass das zu parsende HTML Dokument sich ständig ändert und überall sich wiederholende Zeichenfolgen hat, sodass das ganze nur funktionieren würde, wenn das (.+?) auch wirklich nur bis zum nächsten > geht und nicht bis zum nächsten >x

Ich hoffe, ihr versteht das so wie ich das beschreibe, da ich hier seit Stunden an dem Problem arbeite und total am Ende bin :(

Gruß molleonline

  1. ich versuche ein HTML Dokument mit RegEx zu parsen

    html oder xhtml?

    wenn du zb ein wohlgeformtes xhtml-dokument hast, kannst du das ganze relativ problemlos mit einem xml-parser lesen - das ist wesentlich effizienter als mit einem tagsoup-parser zu arbeiten

    1. einem tagsoup-parser zu arbeiten

      ersetze durch:
      einem selbstgeschriebenen parser bestehend aus regulären ausdrücken zu arbeiten

  2. ich versuche ein HTML Dokument mit RegEx zu parsen und stoße gerade auf folgendes Problem:
    wie schaffe ich es, dass beim String

    <test><test><test>x
    <test><value>x

    und der RegEx /><(.+?)>x/ims
    nur value gefunden wird und nicht test><test und value?

    Verstehe ich dich richtig?
    Du willst, dass x nur dann gefunden wird, wenn es durch <value> angeführt wird?
    Du möchtest aber nicht <value> als Teil der Rückgabe.

    Problemlösung in perl mit positiv lookbehinds

    my $tag = '<value>';

    /(?<=$tag)([^<>]*)/

    Eine Einschränkung haben lookbehinds: Der Suchstring muss eine feste Länge haben.

    Nach PHP portieren musst du selbst.

    mfg Beat

    --
    Woran ich arbeite:
    X-Torah
    ><o(((°>       ><o(((°>
       <°)))o><                      ><o(((°>o
    1. gudn tach!

      Problemlösung in perl mit positiv lookbehinds

      my $tag = '<value>';

      /(?<=$tag)([^<>]*)/

      Eine Einschränkung haben lookbehinds: Der Suchstring muss eine feste Länge haben.

      ab perl 5.10 gilt das fuer zero-width positive look-behinds nicht mehr:

      /$tag\K[^<>]*/

      Nach PHP portieren musst du selbst.

      zumindest der regexp lautet in php auch so. (dort gibt's auch \K)

      prost
      seth