Скажем, у меня есть строка, содержащая две обратные косые черты:
$str = 'some_string\\\\';
Если я повторяю это, я получаю то, что ожидаю:
echo $str; // some_string\\
Но если я использую ту же строку в качестве замены в вызове preg_replace, я получаю только одну обратную косую черту:
echo preg_replace("//", $str, ""); // outputs some_string\
Ожидается ли такое поведение, и если да, как я могу заставить preg_replace выводить ту же строку, что и ввод?
Это только для демонстрации, я вырезал ее.






Вы используете функцию preg_replace с неправильным порядком параметров:
preg_replace($pattern, $replacement, $subject)
Searches
$subjectfor matches to$patternand 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\\"
Я полагаю, это зависит от того, что OP пытается доказать ... технически замена, которую они используют, состояния заменяет "ничего такого" в пустой строке на 'некоторая_строка \\\\' - так что, по логике, вы должны увидеть 'некоторая_строка \\' ... возможно. Вы действительно получите такой результат с preg_replace("//", preg_quote($str), "")
Я не хотел этого, я использую параметры в правильном порядке. Я хочу использовать строку с двойной обратной косой чертой в качестве замены. Я использую пустую тему только для демонстрации.
preg_quote прерывает другие случаи: echo preg_replace ("//", preg_quote ('some_string?'), ""); // some_string \? preg_quote следует использовать только в регулярных выражениях, а не в заменах.
То же самое и с обратной косой чертой.
$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 следует использовать только в регулярном выражении, а не в замене или теме.
Хороший момент по поводу preg_quote() - я думаю, что это все еще процессы, хотя обратная косая черта остается дважды; один раз с preg_replace и еще раз с echo - addslashes() дает тот же результат, что и preg_quote.
... или это может быть так, как preg_replaceвозвращается'some_string\\\\' думает об этом ... возможно, потребуется взглянуть на исходный код для окончательного ответа.
... это определенно кажется немного "причудливым": var_dump($str); // string(13) "some_string\\" <- вот с чем работает preg_replace().
Я что-то упустил ...
preg_replace()содержит только разделители - в шаблоне нет содержимого?