2016-12-16 2 views
1

Кажется, это относительно простая задача, которая заставляет меня застрять в одном приложении PHP. У меня есть строка, в которой есть пучок \n. Это прекрасно и нужно оставаться там. Тем не менее, есть также отдельные вхождения символа \ и те, которые мне нужно заменить или удалить, давайте просто скажем с пустым символом, не удаляя те, за которыми следует n.Как заменить все вхождения только, если они не сопровождаются n?

Лучшее, что я придумал был первым заменить все \n с чем-то еще, какой-то загадочный характер, а затем заменить оставшиеся \ с пустого пространства, а затем преобразовать обратно странный характер \n. Тем не менее, это, кажется, пустая трата времени и ресурсов, кроме того, ничто не гарантирует мне, что я нахожу довольно странный характер, который никогда не встретится в остальной части строки ...

Любые советы?

+0

какое регулярное выражение вы пробовали? – happymacarts

+3

Может быть, 'preg_replace ('~ \\\\ (?! n) ~', '', $ s)'? –

+0

Зачем вам нужно регулярное выражение? У вас есть '\ n' или' \\ n'? \ In '\ n' является ** не ** реальным \. Проверьте это: http://sandbox.onlinephpfunctions.com/code/ea7362ab63707e8e615a2090775b8f28ff94809b – Dekel

ответ

3

Вам нужно

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

Смотрите PHP demo:

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

Мы п eed 4 обратных косых черт для прохождения 2-х литеральных обратных косых черт к движку регулярных выражений для соответствия 1 буквальной обратной косой черты во входной строке. (?!n) - отрицательный lookahead, который не соответствует всем совпадениям обратной косой черты, за которыми сразу следует n.

+0

Спасибо за объяснение, работает как шарм! – mmvsbg

+0

Кроме того, см. [Справочник по строковым литералам PHP] (http://php.net/manual/en/language.types.string.php): * Чтобы указать буквенную одинарную кавычку, избегайте ее с помощью обратного слэша ('' \ ' '). * - как в одиночных, так и в двойных кавычках строковых литералов. –

1

Вы должны быть в состоянии сделать это с отрицательным опережения утверждением:

\\(?!n) 

\\ ищет обратную косую черту, то (?!n) утверждает, что следующий символ не является п, но не совпадает с характером.

Чтобы использовать эту функцию в PHP:

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

Подробности здесь: https://regex101.com/r/F2qhAP/1

+0

это регулярное выражение кажется намного проще других ответов +1 для отрицательного утверждения lookahead – happymacarts

Смежные вопросы