Aya - Mi 30.03.11 09:31
Titel: Reguläre Expression um '<' zu ersetzen
Hi,
Ich muß in einer XML Datei in allen attributen das "<" durch ein "<" ersetzen.
Wir sind von einem alten XML Parser auf einen neuen umgestiegen der damit nicht klarkommt leider..
Mein erster ansatz war einfach zeichen für zeichen den string zu durchsuchen und jedes "<" welches zwischen zwei anführungszeichen steht zu ersetzen. Das funktioniert und ist auch nicht so schwer. Es gibt nur zu beachten das ein anführungszeichen auch mit \ escaped sein kann, und sollte dies der fall sein darf es nur ein backslash sein, keine zwei.
Also als beispiel:
XML-Daten
1: 2: 3: 4: 5: 6:
| <xml> <tag attr="this <is> an example" /> <tag attr="an other \"<example>\"" /> <tag attr="something \\<strange>\\">Here is a quote " just for fun</tag> <tag attr="last <one> <two> <three>" /> </xml> |
Um das ganze etwas zu vereinfachten dachte ich, evtl kann man das auch mit einem regulären ausdruck lösen?
Bin leider nicht sehr bewandert damit, daher dachte ich frage ich mal hier nach ob das geht.. und wenn ja, wie ungefähr :)
Danke~
Aya
PS: Das sollte bei dem beispiel oben rauskommen:
XML-Daten
1: 2: 3: 4: 5: 6:
| <xml> <tag attr="this <is> an example" /> <tag attr="an other \"<example>\"" /> <tag attr="something \\<strange>\\">Here is a quote " just for fun</tag> <tag attr="last <one> <two> <three>" /> </xml> |
BenBE - Mi 30.03.11 10:22
Also soweit ich XML verstanden hatte, sind \ in Strings eigentlich ja auch keine Escape-Zeichen. Von daher mache ich das generell mit Entity-Escapes, womit sich der Aufwand stark in Grenzen hält.
Als erstes musst Du die Attribut matchen, danach kannst Du wie folgt ersetzen:
Quelltext
1: 2: 3: 4:
| /\\\\|\\"|<\>/.replace(function (m) { static $r = array("\\\\" => "\\", "\\\"" => "\"", "<" => "<", ">" => ">"); return $r($m[0]]; } |
Zum Matchen der Attribut-Werte aus der XML-Datei kannst Du etwa Folgendes nehmen:
Quelltext
1:
| /"((?![\\"]).|\\\\|\\")*"/s.matchAll() |