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;)\', '&', $html)
oder, falls es deine anforderungen erlauben, mit htmlentities oder htmlspecialchars zu arbeiten.
prost
seth