2 Stimmen

Regex, einfaches oder doppeltes Anführungszeichen

Ich habe diese Regex:

preg_replace(
    '/\["'.$key.'"\] = (.+?);/is', '["'.$key.'"] = '.$newValue.';',
    $contents);

Er schreibt einen Array-Wert in eine Konfigurationsdatei. Ich muss einfache oder doppelte Anführungszeichen um den Array-Schlüssel zulassen, und ich bin nicht sicher, wie man das macht. Ich habe diese Regex nicht geschrieben.

5voto

Die übliche Art, mit mehreren Zitierweisen umzugehen, besteht darin, sie auszuschreiben: /'a'|"a"/ und dupliziert das, was sich innerhalb der Anführungszeichen befindet, obwohl es sehr wohl etwas anders sein kann (z. B. um ein uneingekapseltes einfaches Anführungszeichen innerhalb einer Zeichenkette mit einfachen Anführungszeichen zu verbieten).

'/\[("'.$key.'"|\''.$key.'\')\] = (.+?);/is'

In manchen Fällen können Sie auch eine Rückverweisung verwenden:

'/\[([\'"])'.$key.'\\1\] = (.+?);/is'

2voto

Andomar Punkte 224164

Sie könnten die "find"-Regex ersetzen, um beide Arten von Anführungszeichen zu finden:

'/\[[\'"]'.$key.'[\'"]\] = (.+?);/is'

Das wird sogar passen:

["MegaKey'] = UberValue;

Und wenn ich Sie wäre, würde ich diese Konfigurationsdatei auf die Liste der Dinge setzen, die ohne Regexe umgeschrieben werden sollen.

1voto

mauris Punkte 41384

Nun, Sie können eine Rückreferenzierung durchführen, um den richtigen Satz von Anführungszeichen zu finden (geöffnet mit double, geschlossen mit double)

preg_replace(
    '/\[([\"\']+)'.$key.'\\1\]\s=\s(.+?);/is', '[\\1'.$key.'\\1] = '.$newValue.';',
    $contents);

\\1 entspricht der ersten Art des verwendeten Zitats

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X