Christian Seiler: Regex: ersetze ;) falls davor nicht abc|de|ghij steht

Beitrag lesen

Hallo Robert,

Leider beschwert sich PHP, wenn ich statt des konstanten Strings alternativ unterschiedlich lange Strings benutze:

(?<!(abc|de|ghij));)

da kommt dann eine Warnung:
Compilation failed: lookbehind assertion is not fixed length at offset 16 in  <filename> on line <linenumber>
(der Offset scheint sich auf die schließende Klammer der Alternative zu beziehen)

Es gibt noch einen dritten Lösungsweg (außer denen, die Daniel beschrieben hat):

(?<!abc)(?<!de)(?<!ghij);)

Da eine Lookbehing-Assertion die Länge 0 hat, kannst Du da auch mehrere hintereinander schreiben, wenn Du sonst den Inhalt mit | trennen würdest. Achtung allerdings: die Menge der Lookbehind-Assertions ist begrenzt und außerdem verlangsamt jede weitere Assertion den Ausdruck. Daher: dort, wo Du zusammenfassen kannst, weil die Teile die gleiche Länge haben, solltest Du das ganze in eine Assertion packen, also bei Deinem Enity-Ausdruck:

(?<!&quot)(?<!&amp)(?<!&(lt|gt));)

Viele Grüße,
Christian