php
  • str-replace
  • 2017-02-05 3 views 2 likes 
    2

    Ich betreibe ein Forum Website mit einigen Emotes-Code des einen ist ;) Nichts seltsam es zu analysieren, verwende ich den Befehl;...) Zeigt Emote, wenn „verwendet wird)

    $text = str_ireplace(array(";)", ";-)", "^wink^"), "<img src='/images/emotes/wink.png' style='height: 30px;width:30px; vertical-align:text-top;'>", $text); 
    

    (sorry, wenn ich getippt . etwas falsch ich konnte nicht copy-paste jetzt) ​​

    Alles funktioniert gut, aber wenn ich versuchte, ein Beispiel-Code zu geben:

    function("mind"); 
    

    ich habe dies im Gegenzug:

    Funktion ("mind" Bild);

    Ich fragte mich, warum es passiert. Ich habe es auch auf anderen Webseiten gesehen (mrush.net). Es passiert nur, wenn Sie ") eingegeben haben, aber nur ) ersetzt. Die Anführungszeichen bleiben.

    Gibt es eine Erklärung dafür?

    +0

    Die Konvention auf dieser Seite ist, Fragen und Antworten streng getrennt zu halten te; Sie sind [aufgefordert, Ihre eigene Frage zu beantworten] (http://stackoverflow.com/help/self-answer), anstatt die Frage zu bearbeiten, um eine Lösung hinzuzufügen. – IMSoP

    Antwort

    4

    Das Problem ist, dass Sie innerhalb einer HTML-Zeichenfolge ersetzen, die Sie bereits mit htmlspecialchars oder ähnlichem entkam, die Anführungszeichen wie &quot; entkommt. So ist die Reihenfolge:

    1. der Benutzer ")
    2. die Escape-Funktion entgeht dies als &quot;)
    3. die Substitution der ;) und Ausgänge sieht &quot<img...>
    4. der Browser sieht die &quot und vorausgesetzt, dass Sie &quot; gemeint, so zeigt ein Anführungszeichen und ein Bild

    Dies ist schwierig, weil Sie können nicht die Ersetzung vor HTML-Escaping anwenden, weil Sie tatsächlichen HTML für das Bild einfügen möchten.

    Ein Ansatz wäre, einen Platzhalter zu verwenden, die eindeutig ist, zum Beispiel Ihre Langform ^wink^:

    1. ersetzen Instanzen ;) mit ^wink^
    2. Flucht HTML
    3. Ersatz ^wink^ mit <img...>
    +1

    @Soaku Beachten Sie, dass ';' nicht durch 'htmlspecialchars' oder' htmlentities' in ';' konvertiert wird. Daher ist mir nicht ganz klar, wie Ihre Lösung funktioniert. Stellen Sie sicher, dass Sie einige Testfälle schreiben, um verschiedene mögliche Eingaben abzudecken. Ich bin froh, dass ich dabei helfen konnte, das Problem zu identifizieren. – IMSoP

    +0

    Es ist noch kniffliger ... Wie ersetzt man;) mit^wink ^, wenn es auch "ersetzen würde"? – Soaku

    +0

    @Soaku Es wird nicht gemacht, wenn du dem HTML noch nicht entgangen bist, die Reihenfolge der Verarbeitung ist die Schlüssel Sache hier. – IMSoP

    Verwandte Themen