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?

  • #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); 

    Kommentar


    • #3
      Also das klappt auch nicht:
      PHP-Code:
      $cleaned preg_replace("/([\"\'\`])id\$1/""x"$createColumn); 

      Kommentar


      • #4
        Hmm, lass mal das Dollarzeichen weg.

        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  '*/  '

          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?

            Kommentar


            • #7
              Hm ungreedy vergessen. Danke schön

              Kommentar


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

                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)
                  ); 

                  Kommentar


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

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

                    angesagt?

                    Kommentar


                    • #11
                      Sehr gut, hab ich auch eingebaut, danke!

                      Kommentar

                      Lädt...
                      X