Philipp.: str_ireplace: Groß- und Kleinschreibung (nicht) ignorieren

Hallo werte SELFHTML-Gemeinde,

ich möchte einen String ersetzen:

$antwort_fett = str_ireplace($eingabe, $eingabe_fett, $antwort);

* $eingabe kommt vom Besucher und kann groß- und/oder kleingeschrieben werden
* $eingabe_fett ist identisch zu $eingabe, aber eingeschlossen von <b>-Tags
* $antwort ist irgendein String der $eingabe enthält

$eingabe soll also in $antwort ersetzt werden, egal ob Groß- oder Kleinschreibung. Allerdings soll die Groß-/Kleinschreibung von $antwort selbst nicht verändert werden.

Konkretes Beispiel:

$eingabe = "a";
$eingabe_fett = "<b>a</b>";
$antwort = "Auto";
$antwort_fett = "<b>A</b>uto";

Lässt sich das bewerkstelligen?

Danke schon mal.

  1. Hi,

    $eingabe_fett = '<b>'.$eingabe.'</b>';

    $antwort_fett = str_ireplace($eingabe, $eingabe_fett, $antwort);

    so meinst du das oder?

    Was das dann mit deiner Überschrift zu tun hat, verstehe ich aber nicht.

    Mario

    1. $eingabe_fett = '<b>'.$eingabe.'</b>';
      $antwort_fett = str_ireplace($eingabe, $eingabe_fett, $antwort);
      so meinst du das oder?

      Ja, so mein ich das.

      Wenn aber

      $eingabe = "a";

      dann ist

      $eingabe_fett = "<b>a</b>";

      Dadurch wird

      $antwort = "Auto";

      aber zu

      $antwort_fett = "<b>a</b>uto";

      Es soll aber

      $antwort_fett = "<b>A</b>uto";

      sein.

      Die Groß-/Kleischreibung von $antwort soll als *erhalten bleiben* (beachtet  werden), $eingabe soll aber *unabhängig* von Groß- und Kleinschreibung des Benutzers in $antwort ersetzt werden.

      Ich hoffe, so ist es verständlich :)

      1. Hi,

        Wenn aber

        $eingabe = "a";

        aha, na so auf Anhieb, ohne Regex zu nutzen würde ich sagen du verzichtest auf str_ireplace nimmst stattdessen die case-sensitive methode und das gleich zweimal bzw in einem, also "a" + "A"

        Kann aber auch sein, dass es noch einfacher geht, bin aber schon zu lange wach;-)

        Mario

        1. Man könnte statt zu ersetzen auch nur den Tag einfügen. Einfacher ist das aber nicht unbedingt.

        2. Regex

          Hm, daran dachte ich auch, aber wenn ich so drüber nachdenke, ergibt sich doch das gleiche Problem, oder?

          die case-sensitive methode und das gleich zweimal bzw in einem, also "a" + "A"

          Ja ... wäre ne Möglichkeit. Nicht hübsch, aber ginge :)

          1. Hi,

            Regex

            Hm, daran dachte ich auch, aber wenn ich so drüber nachdenke, ergibt sich doch das gleiche Problem, oder?

            Nein, nicht notwendigerweise.

            a kann a oder A matchen; beim Zugriff auf das ge-match-te Teilmuster ueber eine Back Reference bekommst du es dann aber so, wie es im Original vorhanden war.

            MfG ChrisB

            --
            „This is the author's opinion, not necessarily that of Starbucks.“
            1. »» Hm, daran dachte ich auch, aber wenn ich so drüber nachdenke, ergibt sich doch das gleiche Problem, oder?

              Nein, nicht notwendigerweise.

              a kann a oder A matchen; beim Zugriff auf das ge-match-te Teilmuster ueber eine Back Reference bekommst du es dann aber so, wie es im Original vorhanden war.

              Verdammt, ich wollte doch RegEx vermeiden :-) Aber okay.

              Wie müsste das ungefähr aussehen?

              $antwort_fett = preg_replace("/($eingabe)/i", "<b>\1</b>", $antwort);

              (bitte nicht lachen :D)

              1. Hi,

                Verdammt, ich wollte doch RegEx vermeiden :-) Aber okay.

                Wie müsste das ungefähr aussehen?

                Du muesstest aus $eingabe einen gueltigen regulaeren Ausdruck machen.

                $antwort_fett = preg_replace("/($eingabe)/i", "<b>\1</b>", $antwort);

                Wenn du nicht weisst, was der Nutzer eingibt und in wie fern sich das ggf. mit der RegEx-Syntax beissen koennte, dann empfiehlt es sich, alle Zeichen darin, die in RegEx Sonderbedeutung haben koennen, zu entschaerfen. Dazu dient preg_quote().

                MfG ChrisB

                --
                „This is the author's opinion, not necessarily that of Starbucks.“
                1. Wenn du nicht weisst, was der Nutzer eingibt und in wie fern sich das ggf. mit der RegEx-Syntax beissen koennte, dann empfiehlt es sich, alle Zeichen darin, die in RegEx Sonderbedeutung haben koennen, zu entschaerfen. Dazu dient preg_quote()

                  Okay, aber so vom Prinzip, wenn es ein einfacher String ist (nur Buchstaben), wie müsste es dann aussehen? Meine Variante/mein armseliger Versuch klappt nicht so recht. Die $eingabe ="a" wird zu $eingabe = "<b> </b>" (Leerzeichen zwischen <b>-Tags).

                  1. Hi,

                    Meine Variante/mein armseliger Versuch klappt nicht so recht. Die $eingabe ="a" wird zu $eingabe = "<b> </b>" (Leerzeichen zwischen <b>-Tags).

                    Nutze $1 statt \1 zum referenzieren der Back Reference.

                    MfG ChrisB

                    --
                    „This is the author's opinion, not necessarily that of Starbucks.“
                    1. Nutze $1 statt \1 zum referenzieren der Back Reference.

                      Aja, vielen Dank - jetzt klappts.

                      Kannst du mir noch kurz sagen, was der Unterschied von $ und \ ist? Laut http://regexp-evaluator.de/tutorial/backreferences/ ist der \ für Backreferences zuständig, $ dagegen als Zeichenbegrenzung.

                      1. Hi,

                        Nutze $1 statt \1 zum referenzieren der Back Reference.

                        Aja, vielen Dank - jetzt klappts.

                        Kannst du mir noch kurz sagen, was der Unterschied von $ und \ ist? Laut http://regexp-evaluator.de/tutorial/backreferences/ ist der \ für Backreferences zuständig, $ dagegen als Zeichenbegrenzung.

                        $ steht nur im Suchmuster fuer das Zeichenkettenende, im Ersatz-String hat es keine RegExp-Sonderbedeutung.

                        \1 statt $1 kannst du genauso nehmen - wenn du den Ersatz-String in einfache Hochkommata einkleidest. Bei doppelten Anfuehrungszeichen haelt der PHP-Parser ihn fur die Einleitung der Notation eines Bytewertes, in diesem Falle 01. Da das kein darstellbares ASCII-Zeichen ist, wird daraus bei der Ausgabe im Browser ein Leerzeichen. Innerhalb doppelter Anfuehrungszeichen muesstest du dann \1 schreiben, damit nachdem PHP mit dem Parsing des Strings fertig ist, ein einfacher Backslash "uebrig" bleibt, und dann beim Auswerten durch den RegExp-Parser als einleitendes Zeichen fuer eine Back Reference erkannt werden kann.

                        MfG ChrisB

                        --
                        „This is the author's opinion, not necessarily that of Starbucks.“
                        1. \1 statt $1 kannst du genauso nehmen - wenn du den Ersatz-String in einfache Hochkommata einkleidest. Bei doppelten Anfuehrungszeichen haelt der PHP-Parser ihn fur die Einleitung der Notation eines Bytewertes, in diesem Falle 01. Da das kein darstellbares ASCII-Zeichen ist, wird daraus bei der Ausgabe im Browser ein Leerzeichen.

                          Achso, alles klar - dann versteh ich jetzt wenigstens auch des preg_replace, was ich an anderer Stelle schon benutze :D

                          Nochmals vielen Dank.

                      2. Aja, vielen Dank - jetzt klappts.

                        Kommt bei Autodach, statt Auto, auch das raus, was Du willst?