php正则表达式中的未知修饰符错误

时间:2013-08-26 16:50:04

标签: php regex preg-match-all

我有自由文本块,包含我需要捕获的多个3位数价格。可选地,这些以'$'或者空格

开头

我有:

    preg_match_all("|[\s|\$][\d]{3}|", $html, $prices);

这给了我:

Severity: Warning
Message: preg_match_all(): Unknown modifier '$'

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

您正在使用管道作为正则表达式的分隔符,并且还在字符类中使用了管道。如果您的意思是"空格/制表符/换行符或美元符号",只需将管道放在第一个字符类中,您就不需要它,它弊大于利。

preg_match_all将此部分视为正则表达式:[\s,将修饰符视为\$][\d]{3}| ......它无法理解。


否则,如果 打算匹配管道(例如代字号)或大多数人都熟悉的斜线(或任何其他不会干扰的符号),请使用其他分隔符与正则表达式):

preg_match_all("~[\s|\$][\d]{3}~", $html, $prices);

preg_match_all("/[\s|\$][\d]{3}/", $html, $prices);

答案 1 :(得分:3)

首先不要将RegExps包装在|.这样的特殊字符中。只要像我一样使用~,因为它几乎不会发生在正则表达式模式,与在HTML和URL中经常出现的/进行比较。

您需要使用单引号来包含$您在此处执行的操作相当于正则表达式中的'$'。虽然你想要'\$'。因此,您需要使用单引号或仅使用'\\\$'。但是,除非您需要在"{$var}"字符串中嵌入PHP变量,否则请使用单引号。

preg_match_all('~[\s|\$][\d]{3}~', $html, $prices); // try this