Почему preg_replace удаляет обратную косую черту?

Скажем, у меня есть строка, содержащая две обратные косые черты:

$str = 'some_string\\\\';

Если я повторяю это, я получаю то, что ожидаю:

echo $str; // some_string\\

Но если я использую ту же строку в качестве замены в вызове preg_replace, я получаю только одну обратную косую черту:

echo preg_replace("//", $str, ""); // outputs some_string\

Ожидается ли такое поведение, и если да, как я могу заставить preg_replace выводить ту же строку, что и ввод?

Я что-то упустил ... preg_replace() содержит только разделители - в шаблоне нет содержимого?

CD001 22.06.2018 10:20

Это только для демонстрации, я вырезал ее.

Jani 22.06.2018 11:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
133
2

Ответы 2

Вы используете функцию preg_replace с неправильным порядком параметров:

preg_replace($pattern, $replacement, $subject)

Searches $subject for matches to $pattern and replaces them with $replacement.

После изменения порядка параметров функция preg_replace возвращает ожидаемое значение:

$str = 'some_string\\\\';
echo $str; // some_string\\

echo preg_replace("/(//)/", "", $str); // some_string\\

Если вы хотите заменить символы //, ваш текущий шаблон регулярного выражения недействителен. Вам необходимо использовать шаблон /(//)/, чтобы заменить символы // значением замены (второй параметр).


Если вы хотите заменить между символами (и вам нужно использовать $str в качестве значения замены), вам нужно указать $str, чтобы preg_replace не преобразовывал \\\\ в \\. В этом случае вы можете использовать следующее, используя addslashes:

$str = 'some_string\\\\';
var_dump(preg_replace("//", addslashes($str), "hi")); // string(41) "some_string\\hsome_string\\isome_string\\"

Вы также можете использовать addslashes в результате preg_replace, чтобы получить тот же результат:

$str = 'some_string\\\\';
var_dump(addslashes(preg_replace("//", $str, "hi"))); // string(41) "some_string\\hsome_string\\isome_string\\"

demo:https://ideone.com/5aZ23G

Я полагаю, это зависит от того, что OP пытается доказать ... технически замена, которую они используют, состояния заменяет "ничего такого" в пустой строке на 'некоторая_строка \\\\' - так что, по логике, вы должны увидеть 'некоторая_строка \\' ... возможно. Вы действительно получите такой результат с preg_replace("//", preg_quote($str), "")

CD001 22.06.2018 10:29

Я не хотел этого, я использую параметры в правильном порядке. Я хочу использовать строку с двойной обратной косой чертой в качестве замены. Я использую пустую тему только для демонстрации.

Jani 22.06.2018 10:46

preg_quote прерывает другие случаи: echo preg_replace ("//", preg_quote ('some_string?'), ""); // some_string \? preg_quote следует использовать только в регулярных выражениях, а не в заменах.

Jani 22.06.2018 11:18

То же самое и с обратной косой чертой.

Jani 22.06.2018 11:37
$str = 'some_string\\\\';
echo preg_replace("//", $str, "");

Технически это должно заменить содержимое пустой строки на some_string\\\\ и повторить его - однако происходит то, что preg_replaceвидит экранированные символы \ в замене, поэтому обрабатывает выражение как preg_replace('//', 'some_string\\', '');

Когда вы повторяете это эхом, он действует как echo 'some_string\\';, поэтому на экране отображается some_string\.

Вы можете увидеть доказательство, если используете preg_quote()addslashes(), поскольку он сначала экранирует символы \.

$str = 'some_string\\\\';
echo preg_replace("//", addslashes($str), ""); # echos 'some_string\\'

Это определенно кажется немного "причудливым", поскольку с универсальной функцией этого не произойдет:

$str = 'some_string\\\\';

function a($s) {
    var_dump($s);
    return $s;
}

echo a($str);

приводит к:

string(13) "some_string\\"
some_string\\

... как и следовало ожидать.

Разве preg_replace не обработает заменяющую строку «как она есть» и просто поместит ее туда? Почему print () этого не делает? Preg_quote нельзя использовать, поскольку он разорвет строку, если есть другие специальные символы. preg_quote следует использовать только в регулярном выражении, а не в замене или теме.

Jani 22.06.2018 10:48

Хороший момент по поводу preg_quote() - я думаю, что это все еще процессы, хотя обратная косая черта остается дважды; один раз с preg_replace и еще раз с echo - addslashes() дает тот же результат, что и preg_quote.

CD001 22.06.2018 10:50

... или это может быть так, как preg_replaceвозвращается'some_string\\\\' думает об этом ... возможно, потребуется взглянуть на исходный код для окончательного ответа.

CD001 22.06.2018 11:07

... это определенно кажется немного "причудливым": var_dump($str); // string(13) "some_string\\" <- вот с чем работает preg_replace().

CD001 22.06.2018 11:17

Другие вопросы по теме