seth: Regex Problemchen ...

Beitrag lesen

gudn tach!

/(&)(?!&&)(?!amp;)/i'

Sieht für mich logisch aus, klappt aber nicht :-) Er ersetzt mir noch immer das & hinter einem & ...

/(&)(?!&&)(?!amp;)/ ist das gleiche wie
/(&)(?!&&|amp;)/
und das sucht nach allen '&', hinter denen weder '&&' noch 'amp;' steht.
also '&&&' und '&' werden nicht gematcht.

die naechste idee waere also wohl
/(&)(?!&|amp;)/

aaber, das matcht z.b. in "a && b" das zweite "&", weil da ja kein "&" (und auch kein "amp;") dahinter steht.

es gaebe da eine andere moeglichkeit, die allerdings nur dann funktioniert, wenn die javascript-code-teile mit <!-- und --> eingeklammert werden und wenn im js-code keine vergleiche gemacht werden, d.h. keine "<" und ">" auftauchen.
sie basiert auf dieser idee aus den php-faq.

preg_replace("/((<[^>]*)|&(?!amp;))/ie", '"\2"=="\1"? "\1":"\1amp;"', $html);

<[^>]*    matcht auf alles, was mit "<" beginnt und kein ">" enthaelt, also z.b. '<a href="bla.php?foo=bar&bar=foo" class="foo"'.

&(?!amp;) matcht auf ein "&", dem kein "amp;" folgt.

((<[^>]*)|&(?!amp;)) ist \2
 ^^^^^^^^
  ist \1

man koennte nun noch versuchen durch weitere trickserei, vergleiche im js-code wieder zuzulassen, aber der code ist jetzt schon nicht besonders schnell und wuerde dadurch mit grosser wahrscheinlichkeit nur noch mehr verlangsamt und auch komplizierter zu lesen/warten.

deswegen schlage ich vor, zu beginn den html-string mit gewoehnlichen string-funktionen zu zerlegen und erst dann mit preg_replace('\&(?!amp;)\', '&amp;', $html) oder, falls es deine anforderungen erlauben, mit htmlentities oder htmlspecialchars zu arbeiten.

prost
seth