optionale Elemente in RegExp

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • optionale Elemente in RegExp

    Tag,

    habe einen regulären, posix-kompatiblen Ausdruck der xml-ähnliche Strukturen erfassen soll.
    Nehmen wir an, wir haben das Tag <tplath attribbut="wert"> und ein anderes Tag nennen wir es <tpl:loop attribut="wert">ein bisschen strings</tpl:loop>.

    Den Ausdruck um den ersten Tag zu erfassen habe ich bereits:

    /(<tpl(.*?)( {1})(.*?)(>)/is

    Wie man sieht deckt dieser aber nur Tags ab, die kein schließendes Element benötigen. Es gibt aber welche, die eines haben.
    Ich will _alle_ Tags (egal ob schließenden Element vorhanden oder nicht) zu Anfang mit einem regulären Ausdruck erfassen und dann spezifisch auswerten.

    Wie kann ich es also schaffen, ein optionales Suchmuster in den Ausdruck zu bringen, das in meinem Fall dem schließenden Tag-Element entspricht. Der Ausdruck soll dieses finden können, aber auch Tag-Elemente mit auflisten, die kein schließenden Element haben.

    Wenn das nicht möglich ist, könnte man immer noch sagen, dass Einzelelemente ohne schließenden Tag einen Slash am Ende des Tag Strings haben, etwa so: <tplath attribut="wert" /> und zuerst diese rausfischen.
    Aber vielleicht geht das mit den optionalen Mustern im Ausdruck ja doch.

  • #2
    Re: optionale Elemente in RegExp

    mit
    PHP-Code:
    !(<tpl:\path attribut="[char-class]"( /)?>)!is 
    sollte es möglich sein, Tags mit Slash und ohne Slash zu erfassen. Somit wäre dann deine zweite Option erfüllt. Beim ersten weiß ich auch nicht

    Kommentar


    • #3
      Nein, so war das nicht gemeint. Es gibt nach meinen Konditionen zwei Arten von Tags:

      einmal einfache: <tag:name attribut="wert">

      und einmal dopellte mit schließenden Tag: <tag:name attribut="wert">werte</tag:name>.

      Ich brauch einen Ausdruck der beides auf einmal erfassen kann.

      Kommentar


      • #4
        PHP-Code:
        "!(<tag:name attribut='wert'((( /)?>)|((.*?)</tag:name)))!s" 
        Sollte eigendlich so funktionieren... - allerdings glaub ich, dass ich ein paar klammern zuviel gesetzt hab

        Kommentar

        Lädt...
        X