johny7: REGEX Backslash

Moin allerseits,

ich will alle Interpunktionszeichen, die in Namen nicht vorkommen, durch Leerzeichen ersetzen. Ich mache das Momentan mit dem Ausruck $search=preg_replace("/[,;:.\/]/" , " " , $search);.
Wie bekomme ich hin, dass sämtliche Backslashes auch entfernt werden? Auch mehrfache Backslashes?

Grüße, JN

--
ie:{ fl:( br:^ va:| ls:[ fo:| rl:? n4:? ss:| de:] js:| ch:? sh:( mo:| zu:)
http://www.johny7.de
  1. Hallo

    Schon mal str_replace versucht...ist ja ein String )also deine URL oder what ever)...

    Gruss

  2. Hello,

    ich will alle Interpunktionszeichen, die in Namen nicht vorkommen, durch Leerzeichen ersetzen. Ich mache das Momentan mit dem Ausruck $search=preg_replace("/[,;:.\/]/" , " " , $search);.
    Wie bekomme ich hin, dass sämtliche Backslashes auch entfernt werden? Auch mehrfache Backslashes?

    Du machst es Dir auch nicht leicht :-)

    Innerhalb von PHP ist der Backslash in Strings mit doppelten Anführungszeichen ein Maskierungszeichen/Escapezeichen für viele Sonderbedeutungen.
    siehe: http://de2.php.net/manual/de/language.types.string.php

    In einem String, der durch einfache Anführungszeichen eröffnet wurde, maskiert der Backslash immer noch das Anführungszeichen.

    Wenn Du also nun in dem Ausdruck

    $search=preg_replace("/[,;:./]/" , " " , $search);

    einen Backslash eingeben willst, dann müsste der also aus PHP-Sicht verdoppelt werden.

    $search=preg_replace("/[,;:.\/]/" , " " , $search);

    Nun ist es so, dass im resultierenden Ausdruck ein Backslash ankommt. Da aber auch bei den Regular Expressions der Backslah für die Maskierung benutzt wird, würde der nun wiederum als Maskierungszeichen für das nachfolgende Zeichen betrachtet werden. Du musst ihn also auch maskieren. Das führt dann irgendwann zu dem Ausdruck

    $search=preg_replace("/[,;:.\\/]/" , " " , $search);

    Und das läuft dann unter dem Motto: "Einer kam durch".

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Moin allerseits,

      Du machst es Dir auch nicht leicht :-)

      So, wie ich es kann...

      Innerhalb von PHP ist der Backslash in Strings mit doppelten Anführungszeichen ein Maskierungszeichen/Escapezeichen für viele Sonderbedeutungen.
      siehe: http://de2.php.net/manual/de/language.types.string.php

      In einem String, der durch einfache Anführungszeichen eröffnet wurde, maskiert der Backslash immer noch das Anführungszeichen.

      Aha... Kontext im Kontext...

      Wenn Du also nun in dem Ausdruck

      $search=preg_replace("/[,;:./]/" , " " , $search);

      einen Backslash eingeben willst, dann müsste der also aus PHP-Sicht verdoppelt werden.

      Hm, das funtkionierte bei mir mit dem einfachen Slash oben aber bisher...

      $search=preg_replace("/[,;:.\/]/" , " " , $search);

      So etwas brauchte ich nicht...

      Nun ist es so, dass im resultierenden Ausdruck ein Backslash ankommt. Da aber auch bei den Regular Expressions der Backslah für die Maskierung benutzt wird, würde der nun wiederum als Maskierungszeichen für das nachfolgende Zeichen betrachtet werden. Du musst ihn also auch maskieren. Das führt dann irgendwann zu dem Ausdruck

      $search=preg_replace("/[,;:.\\/]/" , " " , $search);

      Ich glaube, dir ist ein Fehler unterlaufen: In PHP-Strings muss der einfache slash doch nicht maskiert werden. Aber die Backslashes (für die REGEX braucht man ja zwei, einen für den Backslash und einen um den Backlsash zu maskieren) müssen beide maskiert werden. Deshalb muss der Ausdruck wahrscheinlich so lauten (ich habe Slash und Backslash ein wenig getrennt):
      $search=preg_replace("/[,;\\\\:.\/]/" , " " , $search);

      Und das läuft dann unter dem Motto: "Einer kam durch".

      Das heißt?

      Grüße, JN

      --
      ie:{ fl:( br:^ va:| ls:[ fo:| rl:? n4:? ss:| de:] js:| ch:? sh:( mo:| zu:)
      http://www.johny7.de
      1. Hello,

        Nun ist es so, dass im resultierenden Ausdruck ein Backslash ankommt. Da aber auch bei den Regular Expressions der Backslah für die Maskierung benutzt wird, würde der nun wiederum als Maskierungszeichen für das nachfolgende Zeichen betrachtet werden. Du musst ihn also auch maskieren. Das führt dann irgendwann zu dem Ausdruck

        $search=preg_replace("/[,;:.\\/]/" , " " , $search);

        Ich glaube, dir ist ein Fehler unterlaufen: In PHP-Strings muss der einfache slash doch nicht maskiert werden. Aber die Backslashes (für die REGEX braucht man ja zwei, einen für den Backslash und einen um den Backlsash zu maskieren) müssen beide maskiert werden. Deshalb muss der Ausdruck wahrscheinlich so lauten (ich habe Slash und Backslash ein wenig getrennt):

        $search=preg_replace("/[,;\\\\:.\/]/" , " " , $search);

        Mir war da tatsächlich noch ein Fehler unterlaufen. Da du den normalen Slash als Begrenzungszeichen für das Muster nimmst, muss der mMn in der Zeichenklasse auch maskiert werden.

        $search=preg_replace("/[,;\\\\:.\\/]/" , " " , $search);

        Damit der Maskierungs-Backslash aber durch PHP durchschlüpfen kann, muss er seinerseits maskiert werden.

        Einfacher würde es aussehen, wenn Du

        $search=preg_replace('/[,;\:.\/]/' , ' ' , $search);

        oder

        $search=preg_replace('~[,;\:./]~' , ' ' , $search);

        schreiben würdest.

        Und das läuft dann unter dem Motto: "Einer kam durch".
        Das heißt?

        Na, von vier Backslashes kommt nachher nur einer bei der Auswertelogik an.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Moin allerseits,

          Mir war da tatsächlich noch ein Fehler unterlaufen. Da du den normalen Slash als Begrenzungszeichen für das Muster nimmst, muss der mMn in der Zeichenklasse auch maskiert werden.

          $search=preg_replace("/[,;\\\\:.\\/]/" , " " , $search);

          Damit der Maskierungs-Backslash aber durch PHP durchschlüpfen kann, muss er seinerseits maskiert werden.

          Nein. Ich habe es mit der anderen Variante probiert: es läuft. Du musst doch den normalen Slash in PHP nicht maskieren. Aber im REGEX schon. Deshalb reicht ein Backslash vor dem Slash. PHP gibt ihn auch als einen Slash an REGEX weiter.

          Einfacher würde es aussehen, wenn du
              $search=preg_replace('/[,;\:.\/]/' , ' ' , $search);

          Das ist mir jetzt auch interessant: Wenn ich einfache Anführungszeichen verwende, brauche ich den Backslash nicht mehr zu maskieren? Ich dachte, die REGEX erfordert immer, dass ich den Backslash maskiere. Oder geht das hier, weil dem Backslash ein : folgt, welches nicht maskiert werden braucht?

          oder
              $search=preg_replace('~[,;\:./]~' , ' ' , $search);
          schreiben würdest.

          Ach, ich kann anstelle der / einfach ~ verwenden? Könnte ich theoretisch jeden Buchstaben verwenden?

          Und das läuft dann unter dem Motto: "Einer kam durch".
          Das heißt?

          Na, von vier Backslashes kommt nachher nur einer bei der Auswertelogik an.

          cool

          Grüße, JN

          --
          ie:{ fl:( br:^ va:| ls:[ fo:| rl:? n4:? ss:| de:] js:| ch:? sh:( mo:| zu:)
          http://www.johny7.de
          1. Hello,

            $search=preg_replace("/[,;\\\\:.\\/]/" , " " , $search);

            Damit der Maskierungs-Backslash aber durch PHP durchschlüpfen kann, muss er seinerseits maskiert werden.
            Nein. Ich habe es mit der anderen Variante probiert: es läuft. Du musst doch den normalen Slash in PHP nicht maskieren. Aber im REGEX schon. Deshalb reicht ein Backslash vor dem Slash. PHP gibt ihn auch als einen Slash an REGEX weiter.

            Doch! Dass es trotzdem funktioniert, liegt an dieser unseligen "Fuzzy-Logik" von PHP. Wenn die Kombination \x nicht bekannt ist als Sonderzeichen (x steht hier für beliebiges Zeichen), wird nur der \ weitergereicht und das Zeichen. Aber da \ bekannt ist, wird auch nur ein \ weitergereicht.

            Einfacher würde es aussehen, wenn du
                $search=preg_replace('/[,;\:.\/]/' , ' ' , $search);
            Das ist mir jetzt auch interessant: Wenn ich einfache Anführungszeichen verwende, brauche ich den Backslash nicht mehr zu maskieren? Ich dachte, die REGEX erfordert immer, dass ich den Backslash maskiere. Oder geht das hier, weil dem Backslash ein : folgt, welches nicht maskiert werden braucht?

            Das probiere mal bitte aus. Hier gilt mMn das Gleiche unselige Fuzzy-Verhalten, wie bei PHP. Da : kein Sonderzeichen repräsentiert, wird mMn auch \ und : weitergereicht. Besser wäre es aber mWn, wenn Du \ schreiben würdest. Das hast Du wohl Recht, dass das sauberer wäre.

            oder
                $search=preg_replace('~[,;\:./]~' , ' ' , $search);
            schreiben würdest.

            Ach, ich kann anstelle der / einfach ~ verwenden? Könnte ich theoretisch jeden Buchstaben verwenden?

            Ja, Du kannst alle Zeichen verwenden, die keine Sonderbedeutung haben. Dann musst Du sie aber innerhalb des Musters escapen, wenn sie dann dort normal auftreten sollen. Der Backslash wäre daher eine sehr unglückliche Wahl...

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. Hi!

              $search=preg_replace('/[,;\:.\/]/' , ' ' , $search);
              Das ist mir jetzt auch interessant: Wenn ich einfache Anführungszeichen verwende, brauche ich den Backslash nicht mehr zu maskieren? Ich dachte, die REGEX erfordert immer, dass ich den Backslash maskiere. Oder geht das hier, weil dem Backslash ein : folgt, welches nicht maskiert werden braucht?
              Das probiere mal bitte aus. Hier gilt mMn das Gleiche unselige Fuzzy-Verhalten, wie bei PHP. Da : kein Sonderzeichen repräsentiert, wird mMn auch \ und : weitergereicht. Besser wäre es aber mWn, wenn Du \ schreiben würdest. Das hast Du wohl Recht, dass das sauberer wäre.

              Das Handbuch sagt da was anderes. Die PCRE-Engine wird außerhalb PHPs entwickelt, interessiert sich also nicht für dessen Escape-Logik. Ein Backslash maskiert in einem PCRE-Ausdruck ein nicht-alphanumerisches Zeichen immer, auch dann wenn eine Maskierung an der Stelle nicht notwendig gewesen wäre.

              Ach, ich kann anstelle der / einfach ~ verwenden? Könnte ich theoretisch jeden Buchstaben verwenden?
              Ja, Du kannst alle Zeichen verwenden, die keine Sonderbedeutung haben. Dann musst Du sie aber innerhalb des Musters escapen, wenn sie dann dort normal auftreten sollen. Der Backslash wäre daher eine sehr unglückliche Wahl...

              Nicht raten, nachlesen.

              Lo!

              1. Hello,

                $search=preg_replace('/[,;\:.\/]/' , ' ' , $search);
                Das ist mir jetzt auch interessant: Wenn ich einfache Anführungszeichen verwende, brauche ich den Backslash nicht mehr zu maskieren? Ich dachte, die REGEX erfordert immer, dass ich den Backslash maskiere. Oder geht das hier, weil dem Backslash ein : folgt, welches nicht maskiert werden braucht?
                Das probiere mal bitte aus. Hier gilt mMn das Gleiche unselige Fuzzy-Verhalten, wie bei PHP. Da : kein Sonderzeichen repräsentiert, wird mMn auch \ und : weitergereicht. Besser wäre es aber mWn, wenn Du \ schreiben würdest. Das hast Du wohl Recht, dass das sauberer wäre.

                Das Handbuch sagt da was anderes. Die PCRE-Engine wird außerhalb PHPs entwickelt, interessiert sich also nicht für dessen Escape-Logik. Ein Backslash maskiert in einem PCRE-Ausdruck ein nicht-alphanumerisches Zeichen immer, auch dann wenn eine Maskierung an der Stelle nicht notwendig gewesen wäre.

                Danke für die Korrektur. Ich hatte gehofft, dass Du mitliest.
                Dann kann es bei johny7 also auch nicht "funktioniert" haben...

                Ach, ich kann anstelle der / einfach ~ verwenden? Könnte ich theoretisch jeden Buchstaben verwenden?
                Ja, Du kannst alle Zeichen verwenden, die keine Sonderbedeutung haben. Dann musst Du sie aber innerhalb des Musters escapen, wenn sie dann dort normal auftreten sollen. Der Backslash wäre daher eine sehr unglückliche Wahl...

                Nicht raten, nachlesen.

                Lo!

                Liebe Grüße aus dem schönen Oberharz

                Tom vom Berg

                --
                 ☻_
                /▌
                / \ Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de