Strings ersetzen mit Regex

Riddler84

Grünschnabel
Moin Moin,

bin neu hier und hab ein kleines Regex Problem. Hoffe mir kann da jemand helfen.

Ich möchte aus einem PHP-Code mittels preg_replace, Strings mit einfachen Anführungszeichen ersetzen lassen.

Also so etwas:
PHP:
$string = 'Das ist
ein String über 
mehrere Zeilen';

Jetzt möchte ich alles zwischen ' und ' suchen lassen. Das ist auch kein Problem, aber jetzt kommt der schwere Teil.
Das soll er nur machen, wenn der Teil nicht zwischen " und " steht.

Also so z.B.:
PHP:
$string = "'"; // soll nicht erkannt werden
$string = "Das ist ein String mit einem ' darin"; // Jetzt würde er mit preg_replace bei dem ' anfangen. Das soll er aber nicht, weil es zwischen " und " steht

Mein Ansatz ist bis jetzt folgender:
PHP:
$code = preg_replace("#(?<!\")('.*?')(?!\")#is", '<span style="color:#CC0000;">$1</span>', $code);
Das funktioniert aber nur wenn die Zeichen direkt davor und dahinter sind und nicht wenn es irgendwo dazwischen steht.

Ich hoffe man versteht was ich meine...

Gruß
Riddler
 
Du kannst nicht überprüfen wie der String einst in die Variable übergeben wurde, das spielt ja auch keine Rolle. Dein RegEx Funktioniert nicht, da die " nicht innerhalb des Strings sind sondern nur als begrenzung dienten.

Den tieferen Sinn warum du die nur ersetzen möchtest wenn sie per ' begrenzt wurden verstehe ich auch nicht.
 
Ok hab mich vielleicht falsch ausgedrückt. Das ganze ist der String.

Also so zum Beispiel:
PHP:
$code = '
    $string = \'Das ist
    ein String über 
    mehrere Zeilen\';
';
$code = preg_replace("#(?<!\")('.*?')(?!\")#is", '<span style="color:#CC0000;">$1</span>', $code);
 
Da fehlt noch ein .*? vor dem Hochkomma und hinter dem Hochkomma. Sonst erkennt er nur
" 'test' " aber nicht "Das ist ein 'test' test"

$code = preg_replace("#(?<!\")(.*?)('.*?')(.*?)(?!\")#is", '<span style="color:#CC0000;">$2</span>', $code);

Allerdings funktioniert das nicht so einfach, da ein Text immer zwischen doppelten Anführungszeichen steht wenn am Anfang und am Ende ein solcher Fall auftritt:

"Das ist ein Text in Anführungszeichen"
'Hier soll etwas ersetzt werden, da es nicht in Anführungszeichen steht'
"noch ein Text in Anführungszeichen"

Dein regulärer Ausdruck denkt aber dass der Text der in einfachen Anführungszeichen ebenfalls in doppelten Anführungszeichen steht, es wird also nichts ersetzt.
"Das ist ein Text in Anführungszeichen-->"
'Hier soll etwas ersetzt werden, da es nicht in Anführungszeichen steht'
"<--noch ein Text in Anführungszeichen"
Mit einem simplen Ausdruck ist es da nicht mehr getan. Das Problem klingt für mich nach einer Klammersprache, für die kein regulärer Ausdruck existiert. Lässt sich aber bestimmt mit einigen Tricks anders lösen.
 
Danke aber das t leider nicht.

Um mal ein einfaches Beispiel zu machen.
Ich habe folgenden Text und möchte jetzt ein Pattern haben, was die grün markierten Stellen findet und als Backreference zurück gibt.

'Das ist ein Text'
"Das ist ein 'Text' mit Single Quotes"
'Das ist ein "Text" mit Double Quotes'
''
"'"

Also im Prinzip möchte ich alle Stellen finden, die zwischen Single Quotes stehen inklusive selbiger.
Das aber nur wenn diese Stelle nicht zwischen zwei Double Quotes steht.

Mit meinem Pattern klappt das zwar, aber nur bei "'" und nicht bei bespielsweise " ' ".

Gruß
Riddler
 
Zuletzt bearbeitet:
Zurück