Suche RegExp
Thomas Mell
- php
Hi Leute,
ich schraube jetzt schon 2 Stunden rum und bekomme einen simplen RegExp nicht auf die Reihe.
Es geht um die Erkennung von XML-Attributen die durch kein White Space getrennt sind.
Beispiele:
<tag a="b"c="d">
<tag a='b'c="d">
<tag a="b "c=" d">
<tag a="b"c='d '>
usw...
<tag a="b"> sollte natürlich keinen Treffer liefern, ebensowenig wie <tag>, </tag>, <tag/> oder <tag />
Zwischen dem Attribut a und c fehlt ein (oder mehrere) White Space(s).
Bekommt das jemand hin?
Grüße
Thomas Mell
Hallo Thomas,
Hilft Dir das weiter:
(<\w+) ((\w+)= ?['"] ?\w+ ?['"]){2,}(>)
Gruß,
Dieter
Hi Dieter
das {2,} war es, darauf bin ich nicht gekommen - vielen Dank.
Für die Nachwelt hinterlasse ich hier mal die RegExp welche sich an die W3C-Spezifikationen hält (für ein-Byte Kodierungen):
$reg_S = '[\x20\x09\x0D\x0A]';
$reg_Letter = '[A-Za-z\xC0-\xD6\xD8-\xF6\xF8-\xFF]';
$reg_NameChar = "{$reg_Letter}|[0-9]|[.-_:\xB7]";
$reg_Name = "(?:{$reg_Letter}|_|:)(?:{$reg_NameChar})*";
preg_match("§<{$reg_Name}{$reg_S}+(?:{$reg_Name}{$reg_S}*={$reg_S}*(['"])[^\1]*?\1){2,}[^>]*?>§", $value);
Der RegExp wurde mit folgenden Definitionen erfolgreich getestet:
<tag a="b"c="d">
<tag a='b'c="d">
<tag a="b "c=" d">
<tag a="b"c='d '>
<tag a=""c=''>
<tag a="b"c='d '/>
<tag a=""b=""c=""/>
<tag a="" b=""c=""/>
<tag a=""b="" c=""/>
<tag a="x"b=""c=""/>
<tag a="" b="y"c=""/>
<tag a="b"><tag a=""b="" c="z"/></tag>
<tag a="b" c="d">
<tag a="b"/>
<tag>
</tag>
<tag/>
<tag />
Hallo Thomas,
Ich mach meine Regexp meist so, dass ich The Regex Coach benutze und mir die Bedingungen verbal vorstelle, also etwa
ein < (<
gefolgt von einem Buchstaben oder einer Zahl \w
die einmal oder mehrfach vorkommen +)
gefolgt von einem Leerzeichen usw.
Vielleicht hilft Dir das auch in der Zukunft weiter.
Gruß,
Dieter