bruno1: preg_replace Suchmuster

Hi,

ich bin grad am verzweifeln mit diesem Suchmuster...
$test_alt ist ein String vom User der überprüft werden soll.
Alles was nicht eines dieser Zeichen ist soll ersetzt werden:

A-Za-z0-9
äöüÄÖÜß
+-*/=.,:;?!
()[]{}&"@_'

$test_alt='0123456789qwertzuiopüasdfghjklöäyxcvbnmQWERTZUIOPÜASDFGHJKLÖÄYXCVBNMß+-*/=.,;:?!()[]{}&"@\'§$%\\_<>|^°`´¢';  
$test_neu=preg_replace("/^[A-Za-z0-9\ä\ö\ü\Ä\Ö\Ü\ß\+\-\*\/\=\.\,\:\;\?\!\(\)\[\]\{\}\&\"\@\_\']+$\s/", "?", $test_alt);  
echo $test_neu;

Aber warum funktioniert das nicht?

Und noch wichtiger, warum funktioniert es nicht einmal so:

$test_alt='0123456789qwertzuiopüasdfghjklöäyxcvbnmQWERTZUIOPÜASDFGHJKLÖÄYXCVBNMß+-*/=.,;:?!()[]{}&"@\'§$%\\_<>|^°`´¢';  
$test_neu=preg_replace("/^[A-Za-z0-9]+$\s/", "?", $test_alt);  
echo $test_neu;

Der neue String ist immer gleich dem alten...
Und dabei ist es egal ob ich \s verwende oder nicht, auch ob ich +$ oder *$ verwende ist bei mir egal...

Kann mir bitte jemand helfen ein Suchmuster zu erstellen, welches oben genannte Zeichen zulässt, und den Rest durch ? oder * ersetzt?
Ebenfalls dankbar wäre ich, wenn mir jemand einen Link zu einer Aleitung gibt, wo man das nachlesen kann.

Die PHP-Version ist 5.3.5 in xampp.

bruno1

P.S. Falls ich noch irgendein wichtiges Zeichen für einen Text vergessen habe, das bitte ergänzen.

  1. Hi,

    $test_alt ist ein String vom User der überprüft werden soll.
    Alles was nicht eines dieser Zeichen ist soll ersetzt werden: [...]

    $test_alt='0123456789qwertzuiopüasdfghjklöäyxcvbnmQWERTZUIOPÜASDFGHJKLÖÄYXCVBNMß+-*/=.,;:?!()[]{}&"@'§$%\_<>|^°`´¢';

    $test_neu=preg_replace("/[1]+$\s/", "?", $test_alt);
    echo $test_neu;

    
    >   
    > Aber warum funktioniert das nicht?  
      
    Weil du hier sagst, dass du nur dann, wenn der komplette String von vorne bis hinten \*ausschließlich\* aus den angegebenen Zeichen besteht, ihn durch ein einzelnes Fragezeichen ersetzen möchtest.  
    (Und dann möchtest du „nach dem Ende“ auch noch zusätzlich ein Whitespace-Zeichen haben ...)  
      
    
    > Und noch wichtiger, warum funktioniert es nicht einmal so:  
    >   
    > ~~~php
    
    $test_alt='0123456789qwertzuiopüasdfghjklöäyxcvbnmQWERTZUIOPÜASDFGHJKLÖÄYXCVBNMß+-*/=.,;:?!()[]{}&"@\'§$%\\_<>|^°`´¢';  
    
    > $test_neu=preg_replace("/^[A-Za-z0-9]+$\s/", "?", $test_alt);  
    > echo $test_neu;
    
    

    Weil auch hier nicht zutrifft, dass $test_alt *ausschließlich*, von vorne bis hinten, aus Buchstaben und Ziffern besteht, was du aber verlangst.

    Der neue String ist immer gleich dem alten...

    Kein Treffer, also auch nichts zu ersetzen.

    Kann mir bitte jemand helfen ein Suchmuster zu erstellen, welches oben genannte Zeichen zulässt, und den Rest durch ? oder * ersetzt?

    Informiere dich, was Zeichenklassen sind, und wie man sie negiert.

    Ebenfalls dankbar wäre ich, wenn mir jemand einen Link zu einer Aleitung gibt, wo man das nachlesen kann.

    http://www.google.com/search?q=regex+tutorial

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?

    1. A-Za-z0-9\ä\ö\ü\Ä\Ö\Ü\ß+-*/=.,:;?!()[]{}&"@_' ↩︎

    1. Hi,

      Aber warum funktioniert das nicht?
      Weil du hier sagst, dass du nur dann, wenn der komplette String von vorne bis hinten *ausschließlich* aus den angegebenen Zeichen besteht, ihn durch ein einzelnes Fragezeichen ersetzen möchtest.
      (Und dann möchtest du „nach dem Ende“ auch noch zusätzlich ein Whitespace-Zeichen haben ...)

      OK, das heißt +$ und \s müssen raus, damit es funktioniert, oder?

      Informiere dich, was Zeichenklassen sind, und wie man sie negiert.

      Ist die Negation nicht richtig? Ich hab mal gelesen, dass ich, z.B.  mit
      preg_replace("/^[A-Z], "A", $irgendwas);
      im String irgendwas alle Zeichen durch ein großes A ersetze, die kein Großbuchstabe von A-Z sind.

      http://www.google.com/search?q=regex+tutorial

      Danke für den Link, nach sowas habe ich schon gesucht, ist zwar ziemlich lang, ich werds aber schon schaffen.

      bruno1

      1. Hi,

        Informiere dich, was Zeichenklassen sind, und wie man sie negiert.

        Ist die Negation nicht richtig?

        Sie ist gar nicht vorhanden.

        Ich hab mal gelesen, dass ich, z.B.  mit
        preg_replace("/^[A-Z], "A", $irgendwas);
        im String irgendwas alle Zeichen durch ein großes A ersetze, die kein Großbuchstabe von A-Z sind.

        Nein, das ist keine negierte Zeichenklasse.
        Das ist ein Suchmuster, das lediglich verlangt*, dass das erste Zeichen des Strings ein Großbuchstabe sein muss.

        * bzw. verlangen würde, wenn es erst mal korrekt notiert wäre hinsichtlich Delimiter und PHP-Syntax.

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        1. Hi,

          Sie ist gar nicht vorhanden.

          Ups, da ist mir ^ wohl verrutscht...
          preg_replace("/[^A-Z]/", "A", $irgendwas);
          So müsste es jetzt richtig sein (alles was kein Großbuchstabe von A-Z ist wird ersetzt), aber wie ich das auf der Seite die du mir geschickt hast nachgelsen habe,

          Be careful when using the negated shorthands inside square brackets. [\D\S] is not the same as [^\d\s]. The latter will match any character that is not a digit or whitespace. So it will match x, but not 8. The former, however, will match any character that is either not a digit, or is not whitespace. Because a digit is not whitespace, and whitespace is not a digit, [\D\S] will match any character, digit, whitespace or otherwise.

          Das heißt [\D\S] findet alle Zeichen, aber würde [^\d\s] nicht alle Zeichen finden, die keine Zahl und kein Whitespace sind?

          bruno1

  2. Hi!

    P.S. Falls ich noch irgendein wichtiges Zeichen für einen Text vergessen habe, das bitte ergänzen.

    Definiere "wichtig für einen Text". Die "unwichtigen" ¢ und $ hast du drin, aber nicht das "wichtige" €.  Willst du das auf deutsche Texte einschränken? Was ist mit Fremdwörtern, Zeichen mit Akzenten, Zeichen aus anderen Schriftsystemen, typografische Zeichen? Warum willst du überhaupt die Auswahl einschränken?

    Lo!

    1. Hi,

      Definiere "wichtig für einen Text". Die "unwichtigen" ¢ und $ hast du drin, aber nicht das "wichtige" €.  Willst du das auf deutsche Texte einschränken? Was ist mit Fremdwörtern, Zeichen mit Akzenten, Zeichen aus anderen Schriftsystemen, typografische Zeichen? Warum willst du überhaupt die Auswahl einschränken?

      Versteh mich bitte nicht falsch, $test_alt ist nur ein String zum testen, in ihm sollten die "falschen" Zeichen ersetzt werden, was sie nicht tun.

      $test_alt='0123456789qwertzuiopüasdfghjklöäyxcvbnmQWERTZUIOPÜASDFGHJKLÖÄYXCVBNMß+-*/=.,;:?!()[]{}&"@\'§$%\\_<>|^°`´¢'; // String der überprüft werden soll.  
      $test_neu=preg_replace("/^[A-Za-z0-9\ä\ö\ü\Ä\Ö\Ü\ß\+\-\*\/\=\.\,\:\;\?\!\(\)\[\]\{\}\&\"\@\_\']", "?", $test_alt); // Überprüfung  
      echo $test_neu; // String, indem falsche Zeichen ersetzt wurden.
      

      Außerdem möchte ich das auf deutsche Texte beschränken, da haben Akzenten und andere Schriften nichts verloren, typografische Zeichen brauch ich auch nicht, nur deutsche Zeichen.

      Gut, den € füg ich gleich mit ein, was auch noch wichtig ist wären ein Whitspace und falls es etwas gibt, oder das notwendig ist, ein Zeichen für eine neue Zeile (\n), oder?

      bruno1

      1. Hi,

        ich hab gerade nachgedacht, wenn ich überall UTF-8 als Codierung auswähle, dann muss ich eigentlich nur noch < und > ersetzen, da ich kein HTML, oder andere Programmiersprachen zulassen will, oder?

        Natürlich ist es dennoch sinnvoll ä, ö, ü, Ä, Ö, Ü, und ß zu ersetzen, oder?

        bruno1

        1. Hi,

          ich hab gerade nachgedacht, wenn ich überall UTF-8 als Codierung auswähle, dann muss ich eigentlich nur noch < und > ersetzen

          Richtig, und zwar durch ihre named entities, und das macht die Funktion htmlspecialchars.

          Natürlich ist es dennoch sinnvoll ä, ö, ü, Ä, Ö, Ü, und ß zu ersetzen, oder?

          Nein, ist es natürlich nicht.

          MfG ChrisB

          --
          RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
          1. Hi,

            Richtig, und zwar durch ihre named entities, und das macht die Funktion htmlspecialchars.

            Ich hab gerade auf php.net nachgeschaut, und frage mich gerade, ob es nicht sinnvoller wäre
            $text=htmlentities($text, ENT_QUOTES, 'UTF-8');
            anstatt
            $text=htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
            zuverwenden, da ich mit htmlentities ja alle "Sonderzeichen" ersetze, oder ist das nur unnötiger Rechenaufwand für den Server (und reicht htmlspecialchars)?

            bruno1

            1. Hi,

              Ich hab gerade auf php.net nachgeschaut, und frage mich gerade, ob es nicht sinnvoller wäre [htmlentities] anstatt [htmlspecialchars] zuverwenden, da ich mit htmlentities ja alle "Sonderzeichen" ersetze

              Und warum solltest du das wollen?

              MfG ChrisB

              --
              RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
              1. Hi,

                Und warum solltest du das wollen?

                Gutes Argument...
                Dagegen fällt mir garnichts ein. Nur falls ich mit htmlspecialchars noch Probleme haben sollte, weil vielleicht odch nicht alles UTF-8 Codiert ist, dann könnte ich rein theoretisch auch htmlentities verwenden.

                Vielen Dank für deine Hilfe, das hat mich echt weiter gebracht!

                bruno1

        2. Hi!

          ich hab gerade nachgedacht, wenn ich überall UTF-8 als Codierung auswähle, dann muss ich eigentlich nur noch < und > ersetzen, da ich kein HTML, oder andere Programmiersprachen zulassen will, oder?

          In welchem Kontext? HTML? Dann sind nur die HTML-eigenen Zeichen (<>& und teilweise "') zu beachten. Anderer Kontext -> andere Zeichen.

          Natürlich ist es dennoch sinnvoll ä, ö, ü, Ä, Ö, Ü, und ß zu ersetzen, oder?

          Für welches eigentliche Ziel du das machen willst, hast du noch nicht beschrieben. Deswegen kann ich dir die Frage nach dem Sinn nicht beantworten. Es gibt sicher einige Situationen, in denen es ratsam ist, Nicht-ASCII-Zeichen weitgehend zu vermeiden, aber da fallen mir grad nur Dateinamen ein, weil es hier keinen systemübergreifenden Standard zur Kodierung und den verwendbaren Zeichen gibt.

          Lo!

          1. Hi,

            In welchem Kontext? HTML? Dann sind nur die HTML-eigenen Zeichen (<>& und teilweise "') zu beachten. Anderer Kontext -> andere Zeichen.

            Ja, der Ausgabe String wird später (nach weiteren Verarbveitungen) durch echo als HTML ausgegeben.

            Für welches eigentliche Ziel du das machen willst, hast du noch nicht beschrieben. Deswegen kann ich dir die Frage nach dem Sinn nicht beantworten. Es gibt sicher einige Situationen, in denen es ratsam ist, Nicht-ASCII-Zeichen weitgehend zu vermeiden, aber da fallen mir grad nur Dateinamen ein, weil es hier keinen systemübergreifenden Standard zur Kodierung und den verwendbaren Zeichen gibt.

            Das Ziel ist hier ein Gästebuch zu schreiben, und da möchte ich eben keine Programmiersprachen (HTML, JS, CSS, ...) zulassen.
            Die Ausgabeseite ist UTF-8 codiert, wie auch das Datenbankfeld, in dem der Text gespeichert wird, also ist es eigentlich nicht nötig die Umlaute zu ersetzen.

            bruno1

            1. Hi!

              In welchem Kontext? HTML? Dann sind nur die HTML-eigenen Zeichen (<>& und teilweise "') zu beachten. Anderer Kontext -> andere Zeichen.
              Ja, der Ausgabe String wird später (nach weiteren Verarbveitungen) durch echo als HTML ausgegeben.

              Dann reicht htmlspecialchars(). Wenn noch weitere Verarbeitungen erfolgen, ist es aber noch kein Ausgabestring. Für die Verarbeitung ist es eher hinderlich, wenn bereits Escape-Sequenzen für irgendein Ausgabemedium enthalten sind. Die Aufbereitung für die Ausgabe solltest du erst dann vornehmen, wenn die Ausgabe erstellt wird.

              Das Ziel ist hier ein Gästebuch zu schreiben, und da möchte ich eben keine Programmiersprachen (HTML, JS, CSS, ...) zulassen.

              Wenn du die HTML-eigenen Zeichen beachtest, kann man da so viel Code eingeben, wie man will, mit htmlspecialchars() landet er nur als Daten in der Ausgabe. Kein Problem. Wenn jemand Code eingibt, ist das nicht weiter tragisch, denn er wird vom Browser nicht ausgeführt, nur angezeigt. Und egal, welche Maßnahmen du ergreifst, um unerwünschte Einträge fernzuhalten, es findet sich immer wieder ein Text, den du nicht veröffentlicht sehen willst. Also spar dir die technische Mühe jenseits von htmlspecialchars(), den Inhalt musst du sowieso regelmäßig kontrollieren.

              Die Ausgabeseite ist UTF-8 codiert, wie auch das Datenbankfeld, in dem der Text gespeichert wird, also ist es eigentlich nicht nötig die Umlaute zu ersetzen.

              Richtig. Die Verbindung zu (angenommenerweise) MySQL ist auch auf UTF-8 eingestellt?

              Lo!

              1. Hi,

                Dann reicht htmlspecialchars(). Wenn noch weitere Verarbeitungen erfolgen, ist es aber noch kein Ausgabestring. Für die Verarbeitung ist es eher hinderlich, wenn bereits Escape-Sequenzen für irgendein Ausgabemedium enthalten sind. Die Aufbereitung für die Ausgabe solltest du erst dann vornehmen, wenn die Ausgabe erstellt wird.

                Die weiteren Verarbeitungen sind in dem Fall "nl2br" und "stripslashes", also sollte das kein Problem sein, oder?

                Also spar dir die technische Mühe jenseits von htmlspecialchars(), den Inhalt musst du sowieso regelmäßig kontrollieren.

                Das hatte ich auch nicht vor, ich wollte nur keinen Code und keine "komischen" Zeichen (z.B. ein nicht maskiertes Ä) in der Ausgabe.

                Richtig. Die Verbindung zu (angenommenerweise) MySQL ist auch auf UTF-8 eingestellt?

                Ja, es ist MySQL und auch als UTF-8 eingestellt.

                bruno1

                1. Hallo,

                  Die weiteren Verarbeitungen sind in dem Fall "nl2br" und "stripslashes", also sollte das kein Problem sein, oder?

                  nein, abgesehen davon, dass stripslashes() bei der Ausgabe völlig deplaziert ist und eigentlich höchstens als Schadensbegrenzung bei der Eingabe einen Sinn haben könnte - dann nämlich, wenn entgegen aller Vernunft magic_quotes_gpc eingeschaltet ist.

                  Das hatte ich auch nicht vor, ich wollte nur keinen Code und keine "komischen" Zeichen (z.B. ein nicht maskiertes Ä) in der Ausgabe.

                  Das nicht maskierte Ä ist aber etwas völlig normales, solange du eine Zeichencodierung verwendest, die das kann. Und UTF-8 kann. Es wäre wenig sinnvoll, diese Zeichen trotz UTF-8 als Entity-Referenzen zu schreiben.

                  Ciao,
                   Martin

                  --
                  F: Was ist wichtiger: Die Sonne oder der Mond?
                  A: Der Mond. Denn er scheint nachts. Die Sonne dagegen scheint tagsüber, wenn es sowieso hell ist.
                  Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                  1. Hi,

                    Die weiteren Verarbeitungen sind in dem Fall "nl2br" und "stripslashes", also sollte das kein Problem sein, oder?

                    nein, abgesehen davon, dass stripslashes() bei der Ausgabe völlig deplaziert ist und eigentlich höchstens als Schadensbegrenzung bei der Eingabe einen Sinn haben könnte - dann nämlich, wenn entgegen aller Vernunft magic_quotes_gpc eingeschaltet ist.

                    magic_quotes_gpc Off Off
                    magic_quotes_runtime Off Off
                    magic_quotes_sybase Off Off

                    Also ist es ausgeschaltet, dann kann ich mir stripslashes() sparen, aber du sagtest genrell nein, bedeutet das auch, dass es mit nl2br nach htmlspecialchars noch Probleme gibt? Ich kann es ja nicht davor einsetzen, da dann die < und > Zeichen auch durch &lt; und &gt; ersetzt werden.

                    Das nicht maskierte Ä ist aber etwas völlig normales, solange du eine Zeichencodierung verwendest, die das kann. Und UTF-8 kann. Es wäre wenig sinnvoll, diese Zeichen trotz UTF-8 als Entity-Referenzen zu schreiben.

                    OK, ich verwende nur htmlspecialchars(), und verlass mich auf den Rest.

                    bruno1

                    1. Hallo,

                      magic_quotes_gpc Off Off
                      magic_quotes_runtime Off Off
                      magic_quotes_sybase Off Off
                      Also ist es ausgeschaltet, dann kann ich mir stripslashes() sparen, aber du sagtest genrell nein

                      du hast mich missverstanden. Ich sagte, *wenn überhaupt*, dann als ersten Schritt bei der Behandlung der Eingabedaten. Aber wenn die Magic Quotes überall abgeschaltet sind, gibt es keinen Grund für stripslashes().

                      bedeutet das auch, dass es mit nl2br nach htmlspecialchars noch Probleme gibt?

                      Nein. Erst kommt htmlspecialchars() und wandelt alle <,>,& in ihre entsprechenden Entity-Referenzen um. Und dann kommt nl2br() und ergänzt alle Zeilenumbrüche um ein <br/>.

                      Ciao,
                       Martin

                      --
                      Männer sind ungerecht: Sie sehen immer nur den Baum, den eine Frau mit dem Auto gerammt hat. Aber die vielen Bäume, die sie nicht einmal gestreift hat, sehen sie nicht.
                      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                      1. Hi,

                        Nein. Erst kommt htmlspecialchars() und wandelt alle <,>,& in ihre entsprechenden Entity-Referenzen um. Und dann kommt nl2br() und ergänzt alle Zeilenumbrüche um ein <br />.

                        Gut, dann hat sich meine Frage geklärt.
                        Vielen Dank für deine Hilfe.

                        bruno1

                2. Hi!

                  Die weiteren Verarbeitungen sind in dem Fall "nl2br" und "stripslashes", also sollte das kein Problem sein, oder?

                  stripslashes() ist eines der ersten Schritte, falls du mit dem veralteten, gut gemeinten Sicherheitsfeature Magic Quotes noch zu tun hast und es nicht deaktivieren kannst.

                  Wofür brauchst du nl2br()? Zeilenumbrüche kann man auch mit der CSS-Eigenschaft white-space erhalten.

                  Also spar dir die technische Mühe jenseits von htmlspecialchars(), den Inhalt musst du sowieso regelmäßig kontrollieren.
                  Das hatte ich auch nicht vor, ich wollte nur keinen Code und keine "komischen" Zeichen (z.B. ein nicht maskiertes Ä) in der Ausgabe.

                  Wie gesagt, die einzigen unbedingt zu maskierenden Zeichen sind die HTML-eigenen.

                  Lo!

                  1. Hi,

                    stripslashes() ist eines der ersten Schritte, falls du mit dem veralteten, gut gemeinten Sicherheitsfeature Magic Quotes noch zu tun hast und es nicht deaktivieren kannst.

                    magic_quotes_gpc Off Off
                    magic_quotes_runtime Off Off
                    magic_quotes_sybase Off Off

                    Daraus schließe ich mal, dass ich mir stripslashes() sparen kann.

                    Wofür brauchst du nl2br()? Zeilenumbrüche kann man auch mit der CSS-Eigenschaft white-space erhalten.

                    Auf nl2br() kann ich mich verlassen, und möchte das auch weiter so nutzen.

                    Wie gesagt, die einzigen unbedingt zu maskierenden Zeichen sind die HTML-eigenen.

                    Ich verwende jetzt htmlspecialchars(), und dann nl2br().

                    Danke für deine Hilfe.

                    bruno1