用preg_replace替换反斜杠字符

时间:2014-07-28 14:32:48

标签: php regex

我有这段代码:

$data = 'Test\\vv testing\\vv';
        $data = preg_replace('/(\\vv)/', '\test', $data);

然而在preg_replace之后,$ data仍然是Test \ vv testing \ vv。

我不明白为什么在任何正则表达式测试器上,正则表达式匹配我要替换的字符串部分,即'\ v'部分。

2 个答案:

答案 0 :(得分:6)

反斜杠字符(\)被PHP的解析器和正则表达式引擎(PCRE)视为转义字符。如果您编写一个反斜杠字符,它将被PHP解析器视为转义字符。如果你写两个反斜杠,它将被解释为PHP的解析器的字面反斜杠。但是当在正则表达式中使用时,正则表达式引擎也会将其作为转义字符进行选择。

因此,为了匹配PHP正则表达式中的文字反斜杠,您需要编写四个斜杠:\\\\

来自PHP manual documentation on Escape Sequences

  

单引号和双引号PHP字符串具有反斜杠的特殊含义。因此,如果必须将\与正则表达式\\匹配,则必须在PHP代码中使用"\\\\"'\\\\'

您的代码应为:

$data = preg_replace('/(\\\\vv)/', '\replaced', $data);

Demo


注意:正如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正则表达式引擎。

Regex Demo