Ankündigung

Einklappen
Keine Ankündigung bisher.

Regulärer Ausdruck mit Ergebnisreferenzierung im Pattern selbst

Einklappen

Neue Werbung 2019

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

  • Regulärer Ausdruck mit Ergebnisreferenzierung im Pattern selbst

    Hallo,

    ich möchte aus einem String alle Elemente entfernen, die von bestimmten Zeichen umschlossen sind. Konkretes Beispiel eine MySQL-Spaltendefinition aus "SHOW CREATE TABLE":

    Code:
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    Ich möchte nun prüfen, ob in diesem String NOT NULL vorkommt, allerdings soll sichergestellt werden, dass NOT NULL *nicht* im Spaltennamen, in einem Defaultwert oder einem Kommentar der Spalte vorkommt. Deswegen möchte ich alles zwischen `, " und ' vor dem Einsatz von mb_strpos() löschen.

    PHP-Code:
    preg_replace("/[\"\'\`][^\"\'\`]*[\"\'\`]/"""$createColumn
    Das Problem ist vielleicht nicht gleich offensichtlich. Es ist nun bei diesem RegExp so, dass natürlich auch "hallo' getroffen wird. Das soll nicht so sein, deshalb möchte ich soetwas in der Art:
    PHP-Code:
    preg_replace("/([\"\'\`])[^\$1]*[\$1]/"""$createColumn
    Klappt so leider nicht, es kommt dann das hier heraus:
    Code:
    DEBUG ARG 1:
    
    string(46) "`id` int(10) unsigned NOT NULL AUTO_INCREMENT,"
    
    
    DEBUG ARG 2:
    
    string(36) "0) unsigned NOT NULL AUTO_INCREMENT,"
    Was ich mir nicht so recht erklären kann.

    a) Geht das überhaupt?
    b) wenn ja, wie lautet der RegExp mit Selbstreferenzierung?
    "Mein Name ist Lohse, ich kaufe hier ein."


  • #2
    [\$1]
    Lass mal die Klammern weg

    Und dann einfach mit .*?

    Da es in SQL (nur MySQL ??) die Unsitte """ (oder wie das nochmal war - nutze das nie) gibt, müßte man das noch vorher abfangen.

    [edit]
    Ich glaub die Unsitte geht so:

    PHP-Code:
    SELECT 'fo''bar' FROM baz 
    Das ist natürlich total unpraktisch für reg. Ausdrücke. Aber theoretisch sollte das zielführend sein:

    PHP-Code:
    $createColumn str_replace ("''" '' $createColumn);
    $createColumn preg_replace('/(["\'`]).*?\$1/''' $createColumn); 
    --

    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


    --

    Kommentar


    • #3
      Also das klappt auch nicht:
      PHP-Code:
      $cleaned preg_replace("/([\"\'\`])id\$1/""x"$createColumn); 
      "Mein Name ist Lohse, ich kaufe hier ein."

      Kommentar


      • #4
        Hmm, lass mal das Dollarzeichen weg.
        http://hallophp.de

        Kommentar


        • #5
          LOL, stimmt ja. Betriebsblind.

          PHP-Code:
          $createColumn str_replace ("''" '' $createColumn);
          $createColumn preg_replace('/(["\'`]).*?\1/''' $createColumn); 
          Allerdings solltest Du Kommentare dann auch noch entfernen:

          Code:
          ' /*' nope  '*/  '
          --

          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


          --

          Kommentar


          • #6
            Fett, hattet beide Recht, aber so ganz will es noch nicht
            PHP-Code:
            $createColumn "neunzig `Fuchs\"Dollar` Erntedank 'trotzdem`,' Hallo";
            $cleaned preg_replace('/([\"\'\`])[^\1]*\1/'""$createColumn);
            Debug::stop($createColumn$cleaned); 
            Die einfachen Anführungszeichen sind wichtig, sonst wird die 1 nicht richtig gequotet.

            Aber das Ergebnis ist immernoch falsch, ich denke weil eine Ergebnisreferenzierung in [] einfach nicht geht, kann das sein?
            "Mein Name ist Lohse, ich kaufe hier ein."

            Kommentar


            • #7
              Hm ungreedy vergessen. Danke schön
              "Mein Name ist Lohse, ich kaufe hier ein."

              Kommentar


              • #8
                [^\1]
                Wußte nicht, dass das geht. Aber ist natürlich praktisch.
                --

                „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                --

                Kommentar


                • #9
                  Kann es einen Fall geben, mit einer gültigen SQL-Spaltendefinition, bei dem durch das Entfernen plötzlich ein NOT NULL erzeugt wird?

                  Also blödes Beispiel, sowas: Gernot "Kommentar" NULL DEFAULT
                  Eigentlich nicht oder?

                  Edit: Naja man muss es vielleict nicht übertreiben, mein Pattern mal:
                  PHP-Code:
                  return (bool)preg_match(
                    
                  "/\bNOT\s+NULL\b/",
                    
                  preg_replace('/([\"\'\`])[^\1]*\1/U''\1'$createColumn)
                  ); 
                  "Mein Name ist Lohse, ich kaufe hier ein."

                  Kommentar


                  • #10
                    Hmm, bin ich überfragt. Wäre nicht eher

                    "/\bNOT\s+NULL\b/i",

                    angesagt?
                    --

                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                    --

                    Kommentar


                    • #11
                      Sehr gut, hab ich auch eingebaut, danke!
                      "Mein Name ist Lohse, ich kaufe hier ein."

                      Kommentar

                      Lädt...
                      X