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?

  • Chriz
    antwortet
    Sehr gut, hab ich auch eingebaut, danke!

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    Hmm, bin ich überfragt. Wäre nicht eher

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

    angesagt?

    Einen Kommentar schreiben:


  • Chriz
    antwortet
    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)
    ); 

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • Chriz
    antwortet
    Hm ungreedy vergessen. Danke schön

    Einen Kommentar schreiben:


  • Chriz
    antwortet
    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?

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    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  '*/  '

    Einen Kommentar schreiben:


  • Asipak
    antwortet
    Hmm, lass mal das Dollarzeichen weg.

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    [\$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); 

    Einen Kommentar schreiben:

Lädt...
X