Gustav Gans: regex für Backslash

Hi,

ich stehe am Rande eines Nervenzusammenbruchs nach 10 Stunden Versuchen und Goggeln von geschätzten 300 Seiten. Ich schaffs einfach nicht.

Ich will einfach nur mit einem preg_match prüfen, ob in einem String ein Backslash vorkommt. Wie bitte muß da der reguläre Ausdruck ausssehen?

if(preg_match("  ?????  ",$wort))
{
echo"JA";
}
else
{
echo"NEIN";
}

Wie definiere ich hier einen regulären Ausdruck an Stelle der 4 Fragezeichen, damit bei $wort=Test; ein "NEIN" und bei $wort="Te\st"; ein "JA" ausgegeben wird?

Gustav Gans

  1. Hi Folks,

    beachte:
    Bei einem Backslash musst du diesen besonders schreiben:
    Setzte statt der ??? einfach \ ein

    Hier hast du mal einen kleinen RexEx Tester, damit kannst du deinen Erfolg testen

    Gruß Sascha

    --
    -----------------------
    BohrMedia.de
    1. Hi,

      beachte:
      Bei einem Backslash musst du diesen besonders schreiben:
      Setzte statt der ??? einfach \ ein

      SO schlau war ich natürlich auch schon. Funktioniert nicht. Wird NICHT erkannt.

      Gustav Gans

      1. Hi Folks,

        dann schreib uns doch mal den Text den du überprüfst und den RexEx, den du dafür verwendest.

        Denn diese Schreibweise funktioniert!

        Gruß Sascha

        --
        -----------------------
        BohrMedia.de
  2. Hallo Gustav.

    Ich will einfach nur mit einem preg_match prüfen, ob in einem String ein Backslash vorkommt. Wie bitte muß da der reguläre Ausdruck ausssehen?

    Wie wärs mit strpos()?

    Servus,
    Flo

  3. 0. Vor ganz wenigen Tagen wurde hier ein Thread eröffnet mit dem Titel "REGEX Backslash".

    Ich will einfach nur mit einem preg_match prüfen, ob in einem String ein Backslash vorkommt. Wie bitte muß da der reguläre Ausdruck ausssehen?

    1.1 siehe 0.
    1.2 Warum sollte man mit einem regulären Ausdruck nach einem bekannten Zeichen suchen? Eine ganz normale Suche mit einer Stringfunktion, wie z.B. strpos tut es.

    1. Hi,

      1.2 Warum sollte man mit einem regulären Ausdruck nach einem bekannten Zeichen suchen? Eine ganz normale Suche mit einer Stringfunktion, wie z.B. strpos tut es.

      Nein. Ich hab  mein Problem nur absichtlich vereinfacht, weil ich nur beim Backslash ein Problem habe. Mein eigentliches Problem ist: Ich will wissen, ob in einem String eine Ziffer oder ein Sonderzeichen vorkommt. (Die Ziffern definiere ich mit 1-9 und die Sonderzeichen gebe ich einzeln nacheinander an, wobei spezielle Sonderzeichen wie Klammern, Pipe oder Fragezeichen natürlich einen Backslash davor haben.) Und der Backslash selbstzählt auch zu den Sonderzeichen, die ich da nicht sehen will.

      Und ich schaffe es einfach nicht.

      Gustav Gans

      1. Nein. Ich hab  mein Problem nur absichtlich vereinfacht, weil ich nur beim Backslash ein Problem habe.

        OK.

        Und ich schaffe es einfach nicht.

        0. bzw. 1.1 hast Du übersprungen?!
        https://forum.selfhtml.org/?t=201207&m=1356879

  4. So - bei meinem geschätzten 400. Google-Versuch heute hab ich endlich was gefunden. Auf skdevelopment.com steht Folgendes:

    How to denote a backslash in a regular expression.
    It is a very common case when you have to replace backslashes "" in some string with common slashes "/".
    Of course if this is all which has to be done, using a regular expression would be an overkill. You could do it with the function str_replace().
    Still it could be useful to know how to replace backslashes "" in strings with common slashes "/"  with a regular expression.
    The following code:

    <?php  
    $string = "c:\somepath\somefile.php";  
    $string = preg_replace("/\/","/",$string);  
    echo "$string";  
    ?>
    

    would produce a parser error.
    To make the replacement of "" with "/" correctly, we would have to use the following code:

    <?php  
    $string = "c:\somepath\somefile.php";  
    $string = preg_replace("/\\\\/","/",$string);  
    echo "$string";  
    ?>
    

    It would produce:
    c:/somepath/somefile.php

    Stimmt. Genau so funktioniert es. Um das jetzt auf mein Beispiel umzulegen:

    if(preg_match("/[1-9\$\\\\p*]/",$_POST['wort']))  
    {  
     echo"<p><em>Verboten!</p>\n";  
    }  
     else  
    {  
     echo"<p>Die Eingebe ist OK!</p>\n";  
    }
    

    Das bewirkt, dass ein $_POST['wort'], in dem eine Ziffer, ein kleines p, ein Dollarzeichen oder ein Backslash sind, als verboten markiert wird, alles andere wird durchgelassen.

    Damit ist zwar mein Problem gelöst, aber verstehen tue ich das nicht. Wieso funktioniert \\ und \ (was logisch wäre) funktioniert nicht?

    Gustav Gans

    1. Damit ist zwar mein Problem gelöst, aber verstehen tue ich das nicht. Wieso funktioniert \\ und \ (was logisch wäre) funktioniert nicht?

      https://forum.selfhtml.org/?t=201298&m=1357636

      1. Hi,

        danke, habs jetzt gesehen. Es funktioniert nun. Leider habe ich jetzt das nächste Problem:

        Der Regex für mehrere Sonderzeichen:

        /[§%&'<>#¡¢£¤¥¦©ª«¬®=/¯°²³´µ¶·¸¹º»¼½¾¿×÷]+/

        Das funktioniert für alle betroffenen Zeichen. Gibt man aber das Plusminuszeichen (±) auch noch dazu, egal an welche Stelle, dann sind plötzlich auch ALLE lateinischen Buchstaben betroffen. Das heißt, auch α, Δ oder δ werden "erkannt". Obwohl das gar nicht angegeben ist. Und sobald ich das ± wieder weggebe aus dem Regex, kommen auch alle griechischen Buchstaben wieder durch. Das ganze auf utf-8 Basis.

        Kann sich das wer erkären?

        Gustav Gans

        1. danke, habs jetzt gesehen. Es funktioniert nun. Leider habe ich jetzt das nächste Problem:

          Der Regex für mehrere Sonderzeichen:

          /[§%&'<>#¡¢£¤¥¦©ª«¬®=/¯°²³´µ¶·¸¹º»¼½¾¿×÷]+/

          Einmal so dahingefragt.
          Sind das alle Zeichen, die du nicht willst?
          Warum bildest du nicht eine Zeichenklasse, die das abbildet, was du willst?
          [$whatyouwant]
          Eine solche Zeichenklasse lässt sich immer noch negativ ausdrücken
          [^$whatyouwant]

          mfg Beat

          --
          ><o(((°>           ><o(((°>
             <°)))o><                     ><o(((°>o
          Der Valigator leibt diese Fische
          1. Hi,

            Sind das alle Zeichen, die du nicht willst?

            nein

            Warum bildest du nicht eine Zeichenklasse, die das abbildet, was du willst?

            Weil das, wasich will, fast unendlich ist. Ich lasse utf-8 basierend so gut wie alles zu. Also zB auch Chinesisch. Nur GANZ BESTIMMTE Zeichen, wie zB die hier genannten sollen abgefangen werden. (Und da kommen auch noch welche dazu).

            Leider hat das nicht die Frage ebantwortet, wieso plötzlich ALLE lateinischen Zeichen aufgefangen werden, sobald das Plusminuszeichen dabei ist. :-(

            Gustav Gans

            1. Hallo,

              Weil das, wasich will, fast unendlich ist. Ich lasse utf-8 basierend so gut wie alles zu.

              okay, du verwendest also konsequent UTF-8.

              Leider hat das nicht die Frage ebantwortet, wieso plötzlich ALLE lateinischen Zeichen aufgefangen werden, sobald das Plusminuszeichen dabei ist. :-(

              Weil preg_replace keine Ahnung von Codierungen hat und einfach stur byteweise arbeitet. Das Plusminus-Zeichen (U+00B1) hat beispielsweise die UTF-8-Darstellung C2 B1. Also würde preg_replace alle Zeichen als Match erkennen, die in ihrer UTF-8-Repräsentation entweder den Wert C2 oder B1 enthalten. Der griechische Kleinbuchstabe alpha (U+03B1) ist CE B1. Passt also. ;-)

              Ciao,
               Martin

              --
              Paradox ist, wenn jemand eingefleischter Vegetarier ist.
              Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
              1. Hi!

                Weil das, wasich will, fast unendlich ist. Ich lasse utf-8 basierend so gut wie alles zu.

                Und warum sollen dann ausgerechnet ein paar wenige Zeichen nicht verwendet werden dürfen? Soviel Aufwand, und am Ende kann man trotzdem Mist machen, indem man aus den erlaubten Zeichen was ungewünschtes zusammenbastelt. - Übrigens, die Unicode character properties sind sicher einen Blick wert.

                Weil preg_replace keine Ahnung von Codierungen hat

                jedenfalls von UTF-8 nicht, wenn man nicht den passenden Modifizierer angibt.

                Lo!

                1. Hallo,

                  Weil preg_replace keine Ahnung von Codierungen hat
                  jedenfalls von UTF-8 nicht, wenn man nicht den passenden Modifizierer angibt.

                  ah, schau an, dann geht's also doch. So tief bin ich jetzt nicht eingestiegen.

                  Ciao,
                   Martin

                  --
                  Realität ist eine Illusion, die durch Unterversorgung des Körpers mit Alkohol entstehen kann.
                  Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                2. Hi,

                  jedenfalls von UTF-8 nicht, wenn man nicht den passenden Modifizierer angibt.

                  ich nehme an, auf der von Dir verlinkten Seit emeinst Du den Modifikator u (PCRE_UTF8) mit der Erklärung:

                  Dieser Modifikator schaltet mit Perl nicht kompatible zusätzliche PCRE-Funktionalität an. Suchmuster werden als UTF-8 behandelt. Dieser Modifikator steht unter Unix seit PHP 4.1.0 und unter Win32 seit PHP 4.2.3 zur Verfügung. Ob es sich im Suchmuster um gültiges UTF-8 handelt, wird seit PHP 4.3.5 überprüft.

                  Was immer das jetzt auch heißen mag... :-) ...wenn ich aus meinem

                  /[§%&'<>#¡¢£¤¥¦©ª«¬®=/¯°²³´µ¶·¸¹º»¼½¾¿×÷]+/

                  jetzt ein

                  /[§%&'<>#¡¢£¤¥¦©ª«¬®=/¯°²³´µ¶·¸¹º»¼½¾¿×÷]+u/

                  mache, dann ist das Phenomen verschwunden. Ich hoff, ich hab Deinen Tip richtig umgesetzt (und das u auch an die richtige Stelle gesetzt) und mein Ergebnis ist kein Zufall.

                  Danke!

                  Gustav Gans

                  PS: Was Unicode character properties ist, was mir das sagen soll bzw. wo ich das zu meinem Vorteil einsetzten kann, verstehe ich nicht so ganz.

                  1. Ich hab mich zu früh gefreut.

                    Egal, ob ich das u vor oder nach dem + setze ... jetzt fängt er überahupt nichts mehr auf. :-(

                  2. Hallo,

                    /[§%&'<>#¡¢£¤¥¦©ª«¬®=/¯°²³´µ¶·¸¹º»¼½¾¿×÷]+u/

                    äh nein, so nicht. Die Modifier stehen *hinter* dem Delimiter!

                    Ciao,
                     Martin

                    --
                    Time's an illusion. Lunchtime doubly so.
                      (Douglas Adams, "The Hitchhiker's Guide To The Galaxy")
                    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                  3. Hi!

                    /[§%&'<>#¡¢£¤¥¦©ª«¬®=/¯°²³´µ¶·¸¹º»¼½¾¿×÷]+u/

                    Dass Modifizierer hinter dem Delimiter stehen, hat Martin ja schon erwähnt und das ist eigentlich auch RegExp-Grundlagenwissen.

                    PS: Was Unicode character properties ist, was mir das sagen soll bzw. wo ich das zu meinem Vorteil einsetzten kann, verstehe ich nicht so ganz.

                    Es gibt Escape-Sequenzen, wie \n für New Line, \s für Whitespace, \S für alles außer Whitespace und viele mehr. Diese stehen für bestimmte einzelne Sonderzeichen oder ganze Zeichengruppen. Mit den Unicode-Character-Propertys bekommst du solche Zeichengruppen basierend auf den Eigenschaften, die für die Unicode-Zeichen definiert sind. So steht \pL (oder \p{L}) beispielweise für alle Buchstaben, \pLu für alle großen Buchstaben und \PL für alles was keine Buchstaben sind. Welche Zeichen nun in welche Kategorien fallen, kann ich dir aber nicht sagen. Dazu müsstest du in Richtung Unicode Consortium forschen, denn die definieren diese Eigenschaften. Vermutlich findest du sie in der Unicode Character Database. Bevor du aber jedes Zeichen einzeln definierst und dann doch welche vergisst, wäre eine Auswahl (oder auch ein Ausschluss) über eine (oder mehrere) der Property-Gruppen für dich effektiver und effizienter.

                    Lo!