preg_match() um "$" zu finden

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • preg_match() um "$" zu finden

    Hallo hallo,

    wie so oft stehe ich vor einem Problemchen, wo ich mir die ganze Zeit sage, dass es dafür eine ganz simple Lösung geben müsste, nur dass sie mir nicht einfällt...

    Folgender Code:

    Code:
    $verboten = "/[$]/i";
    $vergleich = "das kostet $preis heute";
    
    echo preg_match($verboten, $vergleich);
    Ich möchte per preg_match() feststellen, ob im String $vergleich das Dollar-Zeichen drin vorkommt. Dachte ich mir, kein Problem, im RegExp eine Zeichenklasse definiert und rein damit. Pustekuchen, der Browser zeigt "0" an.

    Nach etwas Austesten hab ich dann festgestellt, dass es wohl irgendwie an der Tatsache liegen muss, dass ein $-Zeichen in einem String, der durch die double quotes begrenzt wird, wie der Beginn einer Variable behandelt wird. In folgenden strings wird das $-Zeichen richtig erkannt:

    $verboten = 'das kostet $preis heute';
    $verboten = "das kostet preis$preis heute";
    $verboten = "das kostet $ heute";

    Nun meine Frage: Wie teile ich der Funktion mit, dass er ein Dollar-Zeichen im zu untersuchenden String _nicht_ als Beginn einer Variable interpretieren soll?
    Gibt's dafür einen preg modifier oder gibt's dafür 'ne eigene Funktion?

    thx in advance
    smeagol


  • #2
    Hallöchen,

    Hast du es mal damit versucht ?

    $vergleich = "das kostet $preis heute";
    if(strstr($vergleich, "$")) {
    echo "yepp ist vorhanden";
    }
    else {
    echo "nö nüscht da";
    }

    ich hoffe das war´s was du gesucht hast

    Mfg

    My New Projekt: P²Board
    Designer im Team gesucht !

    Kommentar


    • #3
      Ähmmh.... also bei mir kam bei dieser Methode "nö nüscht da" heraus. ?
      Auch andere Testfälle verhielten sich wie oben beschrieben.

      Da ich denke, dass du deinen Vorschlag auf deiner Machine getestet hast und dort wahrscheinlich "yepp" stand, hege ich den Verdacht dass es irgendwie mit der php.ini zu tun haben könnte.

      Kommentar


      • #4
        hm erschreckend. Ich hatte es nicht getestet weil ich dieses mal benutzt hatte. daher....

        Aber egal ich hab es mal ausprobiert. Es geht wirklich nicht richtig. Es funzt bloß wenn das "$" zeichen alleine steht. wenn "$preis" dann nicht. Mit allen anderen Buchstaben, Punkten ect. geht es, nur mit dem Dollar zeichen nicht. Sorry was anderes weiß ich so auch nicht

        Aber es hat nüscht mit meinem Lokalen zu tun. Es geht Lokal und auf dem Server. Hab auch nüscht an der php.ini verändert.

        Mfg
        My New Projekt: P²Board
        Designer im Team gesucht !

        Kommentar


        • #5
          Na dann bin ich wenigstens beruhigt, dass es nicht an einer wie-auch-immer korrupten php.ini liegen könnte... also schon mal eine Fehlerquelle ausgeschlossen.

          Eigentlich denke ich, muss es dafür ja irgendeine Lösung in Form eines modifiers, oder einer einzelnen Funktion etc. geben. Denn: Wenn man den String $vergleich über ein Formular an die Funktion postet, dann wird das $-Zeichen gefunden!
          Fragt sich nur, wie man das ganze ohne Würgaround realisieren kann...

          vielen Dank trotzdem

          smeagol

          Kommentar


          • #6
            ein Backslash vor sonderzeichen die in regulären Ausdrücken verwendet werden, bei dir also \$ und er sucht nach $ Zeichen

            Kommentar


            • #7
              Danke - das hat erstmal geholfen.

              $verboten = "/\$/i";

              klappt.

              Allerdings verstehe ich die Auswertung der Regexp dann nicht so ganz... denn eigentlich hatte ich vor, eine Zeichenklasse zu definieren, und dass sich noch weitere verbotene Zeichen zu dem $ gesellen sollten. Dachte eigentlich, dass in Zeichenklassen die einzelnen Zeichen keine Bedeutung mehr haben (denn das geht so bei JavaScript), aber na gut. Wenn ich nun jedoch folgendes probiere

              $verboten = "/[\$]/i";

              findet er noch immer nichts. Interessanterweise gibt er aber true zurück, wenn in $vergleich ebenfalls ein \ vor dem $-Zeichen steht... da vergleicht er anscheinend Buchstabe für Buchstabe?
              Oje, das sieht alles nach Tiefseetauchen im Meer der Regular Expressions aus

              Kommentar


              • #8
                hm so eine Ähnliche Funktion hatte ich auch schon in einem anderen Thread gesucht. Eine wo ich in einer Variable verbotene Zeichen speichern kann. Welche jedes mal einen Textfeld untersucht das über ein Forumlar versendet wird.
                Im moment muß ich für jedes Zeichen, Buchstaben exrta definieren. Und da ist meine Datei endlos lang

                Mfg
                My New Projekt: P²Board
                Designer im Team gesucht !

                Kommentar


                • #9
                  1) $verboten = "$";
                  2) $verboten = "/[$]/i";
                  3) $verboten = "/\$/i";

                  x) $vergleich = "das kostet $preis heute";

                  a) echo strstr($vergleich, $verboten);
                  b) echo preg_match($verboten, $vergleich);

                  Fangen ich mal bei x) an: In Gänsefüßen werden Variablen durch ihren Wert ersetzt. Möchtest du, dass $preis als Text im String steht, dann benutze Hochkommata:
                  y) $vergleich = 'das kostet $preis heute';

                  Das gleiche gilt bei 1,2,3: Entweder ein Backslash vor den Dollar oder Hochkommata benutzen.
                  Soll der Backslash dann tatsächlich im String auftauchen, mußt du ihn doppelt schreiben, egal ob du Gänsefüße oder Hochkommata benutzt.

                  ergo: entweder
                  echo strstr ('$', $vergleich);
                  oder
                  $verboten = '\\$'; bzw. $verboten = "\\$";
                  echo strstr ($verboten, $verleich);
                  oder
                  $verboten = '[\\$]'; bzw. $verboten = "\\\$";
                  echo ereg($vergleich, $verboten);
                  oder so ähnlich mit preg_match
                  mein Sport: mein Frühstück: meine Arbeit:

                  Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

                  Kommentar


                  • #10
                    Vielen Dank nochmal für deine Erklärung.

                    Ich bin jetzt glaub ich etwas schlauer geworden, was RegExp und Sonderzeichen angeht. Nur sind die Dinge bei preg_ Funktionen wohl etwas anders als bei ereg() und Konsorten.

                    Da bin ich mir nämlich gar nicht so sicher, dass man Sonderzeichen in Zeichenklassen (diese Dinger: [ ]) tatsächlich definieren muss. Beispiel:

                    Code:
                    $string = 'Das ist mein $preis';
                    
                    $reg = "/[p$]/i";
                    $reg1 = "/[$]/i";
                    $reg2 = "/[p]/i";
                    
                    if(preg_match($reg, $string)) echo 'Treffer (Zeichenklasse).<br>';
                    if(preg_match($reg1, $string)) echo 'Treffer eins (Zeichenklasse mit einem \).<br>'; 
                    if(preg_match($reg2, $string)) echo 'Treffer zwei (Zeichenklasse mit zwei \).<br>';
                    Das matched nämlich in allen drei Varianten. Nun könnte man denken, da $ nicht escaped worden ist, also wird einfach nur nach einem Zeilenende gecheckt (und das ist ja in jedem Fall vorhanden, würde also immer zutreffen). Definiere ich $string aber wie folgt:

                    $string = 'Das ist mein reis';

                    dann trifft keiner zu. Nach vorsichtiger Einschätzung würde ich deshalb schlußfolgern, dass das $ eben doch nicht als Zeilenende, sondern als $ übergeben wurde.
                    Übrigens macht es nach meinem bisherigen Tests keinen Unterschied, ob ich die Definitionen von $reg, $reg1 usw. in single oder double quotes angebe.
                    Das alles hier nur so zur Info, wer hier jetzt endgültig aus dem Thread aussteigt, den kann ich gut verstehen

                    sl
                    smeagol





                    Kommentar


                    • #11
                      gaaanz einfache Lösung

                      Warum einfach, wenn´s auch umständlich geht?

                      Ich hab mich selbst eben erst an die guten alten String-Funktionen erinnert:

                      $verboten = '$';
                      echo strlen($vergleich)>strcspn($vergleich,$verboten);

                      In $verboten einfach alle Zeichen auflisten, die du nicht zulassen willst. strcspn($vergleich,$verboten) liefert dir die Position des ersten Zeichens in $vergleich, das in $verboten enthalten ist; oder strlen($vergleich), wenn keins drin ist.

                      Ist strlen($vergleich) größer als strcspn($vergleich,$verboten), dann ist ein Zeichen aus $verboten in $vergleich enthalten.
                      mein Sport: mein Frühstück: meine Arbeit:

                      Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

                      Kommentar


                      • #12
                        ganz einfach?

                        Also wenn ich direkt vergleiche

                        if(strlen($vergleich)>strcspn($vergleich,$verboten)) echo "verboten";

                        if(preg_match($reg, $vergleich) echo "verboten";

                        dann finde ich deine Lösung jetzt nicht gerade viel einfacher. Klar, sie ist verständlich und man muss sich nicht mit RegExp auseinandersetzen - hat auch was.

                        Aber: Ich muss eine weiter Funktion einsetzen, um abzufangen ob ein verbotenes Zeichen an erster Stelle steht. Find ich von diversen PHP-String-Funktionen kreuzblöd, dass sie bei Nicht-Auftreten des gesuchten Strings nicht -1 zurückgeben, sonst könnte man sich nämlich die strlen-Abfrage ersparen.

                        Diesen Umstand hab ich nicht bei pregs und RegExps. Außerdem kann ich das (den?) RegExp ja noch um weitere Angaben ergänzen und somit die Suche genauer machen.

                        Natürlich sind String-Funktionen für einfache Abfragen genau die richtigen, aber wenn's mal ein etwas feineres Suchmuster gibt...

                        Trotzdem danke, die strcspn() Funktion hatte ich ehrlich gesagt total vergessen

                        Kommentar


                        • #13
                          hmm,

                          regExp. sind auch nicht gerade mein Steckenpferd, manchmal funzt alles wunderbar und manchmal geht nichts wie man sich das vorstellt. also probiere es mal so /[\$]./i der Punkt zeigt an dass er genau ein Zeichen finden soll. zB. /[\$].*/i sollte auftretende $$$$ Ketten jeder Länge finden, hierbei bedeutet . wieder ein Zeichen und das * hinterher das der . sooft wiederholt werden darf wie es halt gerade sein muss.

                          Kommentar

                          Lädt...
                          X