Preg_match_all():未知的修饰符'w'

时间:2013-09-10 15:20:55

标签: php regex html-parsing preg-match-all

我正在使用preg_match_all()函数从HTML代码中解析一些数据。为了使它更容易,我使用正则表达式工具来做到这一点。 所以,我的模式就像:

<td class="(weekday|weekend) reservation (primary|alternate) fixwidth calday fixwidth " >(.*?)</td>

当我在regex工具中使用它时,我得到了结果。但是当我输入preg_match_all()函数时,我没有得到结果。我尝试在在线PHP函数测试器(functions-online.com/preg_match_all.html)上运行它,该模式使用消息unknown modifier 'w'给出null结果。

抱歉..这就是我调用useg_match_all函数的方法:

preg_match_all('|<td class="(weekday|weekend) reservation (primary|alternate) fixwidth calday fixwidth " >(.*?)</td>|', $v, $matches3, PREG_PATTERN_ORDER);

是什么让它有不同的结果?以及如何使用preg_match_all()使用该模式获得结果?

我希望有人帮助我。谢谢。

2 个答案:

答案 0 :(得分:3)

preg_match_all('/<td class="(weekday|weekend) reservation (primary|alternate) fixwidth calday fixwidth " >(.*?)<\/td>/', $stringToSearch, $results)

首先,您必须使用分隔符,例如。 /包装regexp。

其次,如果您使用/作为分隔符,则必须在提供的正则表达式中避免每次出现它。

答案 1 :(得分:1)

我可以看到你使用|作为正则表达式分隔符,但是它干扰了正则表达式中使用的OR运算符|,只需像这样调用函数:

 preg_match_all('/<td class="(weekday|weekend) reservation (primary|alternate) fixwidth calday fixwidth " >(.*?)</td>/', $v, $matches3, PREG_PATTERN_ORDER);

这是PHP对您的原始表达式进行成像的方式:|<td class="(weekday|w然后它假定管道符w之后的|是正则表达式修饰符,但w不是因此是一个极好的问题。

警告:请注意,您不应该使用正则表达式来解析HTML,而是使用HTML解析器。