为什么preg_replace删除反斜杠?

时间:2018-06-22 08:11:51

标签: php

假设我有一个包含两个反斜杠的字符串:

$str = 'some_string\\\\';

如果我回声,我会得到我所期望的:

echo $str; // some_string\\

但是,如果我在preg_replace调用中使用相同的字符串作为替换,我只会得到一个反斜杠:

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

这种行为是否正常?如果可以,我如何使preg_replace输出与输入相同的字符串?

2 个答案:

答案 0 :(得分:3)

您使用的preg_replace函数的参数顺序错误:

preg_replace($pattern, $replacement, $subject)
  

搜索$subject$pattern的匹配项,并将其替换为$replacement

更改参数顺序后,preg_replace函数将返回期望值:

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

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

如果您要替换字符//,则当前的正则表达式模式无效。您需要使用模式/(\/\/)///字符替换为替换值(第二个参数)。


如果要在字符之间进行替换(并且需要使用$str作为替换值),则需要引用$str,以便preg_replace不会转换{{ 1}}至\\\\。在这种情况下,您可以使用addslashes使用以下内容:

\\

您还可以在addslashes的结果上使用preg_replace获得相同的输出:

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

演示: https://ideone.com/5aZ23G

答案 1 :(得分:1)

$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 \\

...如您所愿。