假设我有一个包含两个反斜杠的字符串:
$str = 'some_string\\\\';
如果我回声,我会得到我所期望的:
echo $str; // some_string\\
但是,如果我在preg_replace
调用中使用相同的字符串作为替换,我只会得到一个反斜杠:
echo preg_replace("//", $str, ""); // outputs some_string\
这种行为是否正常?如果可以,我如何使preg_replace
输出与输入相同的字符串?
答案 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\\"
答案 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 \\
...如您所愿。