PHP preg_replace escaped fälschlicherweise single quotes

  • Ersteller Ersteller Mr. Snoot
  • Erstellt am Erstellt am
M

Mr. Snoot

Gast
Hio,

ich formatiere in einem Text Suchbegriffe gelb. Dazu wird der ausgegebene Text mit preg_replace durchsucht und Suchbegriffe entsprechend ausgezeichnet.

Der Code dazu sieht so aus:
PHP:
$inhalt = preg_replace("/((<[^>]*)|$search_str)/e", '"\2"=="\1"? "\1":"<a class=\"suchbegriff2\" name=\"suchanker\">\1</a>"', $inhalt);

Eigentlich werden damit nur Wörter außerhalb von <...> ersetzt, damit bspw. Links nicht zerstört werden wenn der Suchbegriff in href oder so auftaucht.

Jetzt hab ich auf einer Seite Javascript in einem <a>-Tag und plötzlich werden bei der Ausgabe alle single quotes darin escaped.

So wird aus:
PHP:
<a class="switch_weiter_pfeil" onclick="fet('weiter', document.getElementById('switch_text').firstChild.id, document.getElementById('switch_bild').firstChild.id, 'de', 'fet')" href="javascript:void(0);">
plötzlich
PHP:
<a class="switch_weiter_pfeil" onclick="fet(\'weiter\', document.getElementById(\'switch_text\').firstChild.id, document.getElementById(\'switch_bild\').firstChild.id, \'de\', \'fet\')" href="javascript:void(0);">

Schuld daran ist der Modifikator e, der eben single quotes escaped.


Was kann ich denn nun tun? Den Modifikator brauch ich, weil im im Ersetzungsaudruck single und double quotes vorkommen. Aber eigentlich sollte doch in dem <a>-Tag von vornherein gar nichts ersetzt und damit auch nicht escaped werden!?
 
Der erste Teil von deinem Regex - der mit den spitzen Klammern - tut nicht das, was du vorhast. Er matcht nämlich eine öffnende spitze Klammer, gefolgt von beliebig vielen Zeichen bis hin zur nächsten schließenden spitzen Klammer (diese selbst nicht mehr). Klar, daß dann die Inhalte von HTML-Tags mit verwurstet werden.

Tip: Rubular ist super zum Regex-Debugging.
 
Also eigentlich funktioniert das bisher einwandfrei. Hier wird bei der Suche nach Elektromigration aus:
HTML:
<a href="/metallisierung/aluminium/#Elektromigration">Elektromigration</a>
korrekt
HTML:
<a href="/metallisierung/aluminium/#Elektromigration"><a class="suchbegriff2" name="suchanker">Elektromigration</a></a>
und nicht etwa sowas wie
HTML:
<a href="/metallisierung/aluminium/#<a class="suchbegriff2" name="suchanker">Elektromigration</a>"><a class="suchbegriff2" name="suchanker">Elektromigration</a></a>
Wörter innerhalb von <...> werden also wie gewünscht nicht ersetzt und auch die Anführungszeichen werden nicht escaped; nur bei diesem Javascript klappt es nicht.


Der Link selbst funktioniert dann zwar nicht, aber das ist nicht so wichtig. Hauptsache der Code bleibt heil
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben