我有自由文本块,包含我需要捕获的多个3位数价格。可选地,这些以'$'或者空格
开头我有:
preg_match_all("|[\s|\$][\d]{3}|", $html, $prices);
这给了我:
Severity: Warning
Message: preg_match_all(): Unknown modifier '$'
我该如何解决这个问题?
答案 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