2016-12-16 14 views
1

Scheint relativ einfache Aufgabe, die mich in einer PHP-Anwendung stecken bleibt. Ich habe eine Zeichenfolge, die eine Reihe von \n enthält. Die sind in Ordnung und müssen dort bleiben. Es gibt jedoch auch einzelne Vorkommen des Zeichens \ und diejenigen, die ich ersetzen oder entfernen muss, sagen wir einfach mit leerem Zeichen, ohne diejenigen zu entfernen, denen n folgt.Wie ersetzen Sie alle Vorkommen von nur, wenn sie nicht von n gefolgt werden?

Das Beste, was ich mit war kam zum ersten sonst all \n mit etwas zu ersetzen, einige seltsamen Zeichen, ersetzen Sie dann die restlichen \ mit leeren Raum und dann die seltsamen Zeichen \n konvertieren zurück. Allerdings scheint das eine Verschwendung von Zeit und Ressourcen zu sein, außerdem garantiert mir nichts, dass ich merkwürdig genug Charakter finden werde, der im Rest der Schnur nie vorkommen wird ...

Irgendwelche Tipps?

+0

Was Regex haben Sie versucht? – happymacarts

+3

Vielleicht 'preg_replace ('~ \\\\ (?! n) ~', '', $ s)'? –

+0

Warum brauchen Sie Regex dafür? Hast du '\ n' oder' \\ n'? Das \ in '\ n' ist ** nicht ** ein echtes \. Überprüfen Sie dies: http://sandbox.onlinephpfunctions.com/code/ea7362ab63707e8e615a2090775b8f28ff94809b – Dekel

Antwort

3

Sie benötigen

$s = preg_replace('~\\\\(?!n)~', '', $s); 

Siehe PHP demo:

$s = '\\n \\t \\'; 
$s = preg_replace('~\\\\(?!n)~', '', $s); 
echo $s; // => \n t 

Wir n Setzen Sie 4 Backslashes ein, um 2 Literal-Backslashes an die Regex-Engine zu übergeben, um 1 Literal-Backslash in der Eingabezeichenfolge zu finden. Der (?!n) ist ein negativer Lookahead, der alle Übereinstimmungen eines umgekehrten Schrägstrichs fehlschlägt, der sofort mit n folgt.

+0

Vielen Dank für die Erklärung, funktioniert wie ein Charme! – mmvsbg

+0

Siehe auch [PHP string literals reference] (http://php.net/manual/en/language.types.string.php): * Um ein literales einfaches Anführungszeichen anzugeben, fange es mit einem umgekehrten Schrägstrich ('' \ ' '). * - Sowohl in String-Literalen mit einem als auch mit zwei Anführungszeichen. –

1

sollten Sie in der Lage sein, diese Behauptung mit einer negativen Look-Ahead zu tun:

\\(?!n) 

Die \\ für den umgekehrten Schrägstrich sieht, behauptet die (?!n) dass das nächste Zeichen keine n, aber nicht den Charakter entsprechen.

Um dies in PHP zu verwenden:

$text = 'foo\nbar\nb\az\n'; 
$newtext = preg_replace('/\\\\(?!n)/', '', $text); 

Einzelheiten hier: https://regex101.com/r/F2qhAP/1

+0

dieser Regex scheint viel einfacher als andere Antworten +1 für negative Lookahead Behauptung – happymacarts

Verwandte Themen