我有这段代码:
$data = 'Test\\vv testing\\vv';
$data = preg_replace('/(\\vv)/', '\test', $data);
然而在preg_replace之后,$ data仍然是Test \ vv testing \ vv。
我不明白为什么在任何正则表达式测试器上,正则表达式匹配我要替换的字符串部分,即'\ v'部分。
答案 0 :(得分:6)
反斜杠字符(\
)被PHP的解析器和正则表达式引擎(PCRE)视为转义字符。如果您编写一个反斜杠字符,它将被PHP解析器视为转义字符。如果你写两个反斜杠,它将被解释为PHP的解析器的字面反斜杠。但是当在正则表达式中使用时,正则表达式引擎也会将其作为转义字符进行选择。
因此,为了匹配PHP正则表达式中的文字反斜杠,您需要编写四个斜杠:\\\\
:
来自PHP manual documentation on Escape Sequences:
单引号和双引号PHP字符串具有反斜杠的特殊含义。因此,如果必须将
\
与正则表达式\\
匹配,则必须在PHP代码中使用"\\\\"
或'\\\\'
。
您的代码应为:
$data = preg_replace('/(\\\\vv)/', '\replaced', $data);
注意:正如Bob0t在评论中正确地说的那样,对于此任务,您不需要preg_replace()
,因为它只涉及普通字符串而不是模式。简单的str_replace()
就足够了:
$data = str_replace('\\vv', '\test', $data);
答案 1 :(得分:1)
在PHP中,您可以使用:
$re = "/\\\\vv/";
$str = "Test\\vv testing\\vv";
$subst = '\\replaced';
$result = preg_replace($re, $subst, $str);
在PHP中,您需要使用\\\\
来匹配单个反斜杠\
。这是因为第一个escapig用于PHP字符串,第二个转义用于底层PCRE正则表达式引擎。