正则表达式转义规则 - 与Perl兼容的正则表达式

时间:2014-07-30 21:13:39

标签: php regex escaping

为什么在下面的代码中,为了匹配字符串,那么我们必须使用两个反斜杠转义'$'而不是一个?

<?php
$text = "$3.99";
preg_match_all("/\\$\d+\.\d{2}/", $text, $matches) ;
var_dump($matches) ;
?>

output: array (size=1)
  0 => 
    array (size=1)
      0 => string '$3.99' (length=5)

模式的匹配规则是什么:“/\ $ \ d+。\ d {2} /”(一个反斜杠)

2 个答案:

答案 0 :(得分:2)

http://php.net/manual/en/language.types.string.php

来自文档

  

如果字符串用双引号(&#34;)括起来,PHP将解释更多特殊字符的转义序列:

然后

\\  backslash
\$  dollar sign

所以双反斜杠是字符串而不是正则表达式

单个反斜杠会导致$ literal然后传递给正则表达式

答案 1 :(得分:0)

我认为php有一些描述正则表达式字符串的选项 在第一级,他们似乎想要某种字符串因为
他们没有像Perl这样的运营商引用,至少我不这么认为。

2级,他们转到正则表达式分隔符(远离双引号作为分隔符)。

等级3,原始正则表达式在1&amp;之后保持裸露。 2完成了。

通常情况下,你已经将进程反向3 - 2 -1,并将其呈现给php源代码。

注意 - 正则表达式分隔符是一项棘手的业务。在第2级,你有可能 选择正则表达式中不可避免的分隔符。在您的情况下&#39; $&#39;将
不是一个可行的分隔符。

一些可能性可能对你有帮助......

\$\d+\.\d{2}                 # raw regex

/\$\d+\.\d{2}/               # no quote, using '/' for delimeter
'/\$\d+\.\d{2}/'             # single quotes        ""
"/\\$\\d+\\.\\d{2}/"         # double quotes        ""

~\$\d+\.\d{2}~                # no quote, using '~' for delimeter
'~\$\d+\.\d{2}~'              # single quotes        ""
"~\\$\\d+\\.\\d{2}~"          # double quotes        ""