preg_match_all无法按预期工作

时间:2012-10-19 18:45:55

标签: php regex html-parsing

我希望根据以下正则表达式在网页上获取匹配项: (。*) 我在regexpal.com(一个在线正则表达式测试工具)上测试它,它工作正常。 但是,当我在php中使用它时,我找不到任何匹配项。我在php中使用的语句是

preg_match_all("/<a href=\"\/title\/.*\/\">(.*)<\/a>/", $content, $matches);

我检查了$内容,这是正确的。那么我的陈述有什么不对吗?谢谢!

3 个答案:

答案 0 :(得分:4)

请...为了上帝的爱,请不要在/中包装处理URL或HTML的正则表达式。你必须在整个地方逃避它。它是可怕的。看这里:

preg_match_all('~<a href="/title/[^">]+/">(.*?)</a>~si', $content, $matches);
  1. 单引号。不再需要逃避双引号。当你没有可扩展的“{$ variables}”时,为什么要使用双引号?
  2. 将RegExp包装到任何非保留字符。对于URL和HTML /是最糟糕的选择,因为它会让你逃避冗余地狱。
  3. 在HTML中使用'si'作为标记,因为标记可以是多行和。+?要么 。*?默认情况下匹配多行。你需要不区分大小写。
  4. 避免使用。+?在属性。您可以捕获整个标签。添加中断字符。请参阅上面的我的模式...所以如果HTML被破坏,你就不要过度了。
  5. 有更多方法可以改善这一点,但这应该做到。

    希望它有所帮助。

答案 1 :(得分:1)

您需要添加?&gt;&gt;

,使您的正则表达式模式变得懒惰(非贪婪)
preg_match_all("/<a href=\"\/title\/.*?\/\">(.*?)<\/a>/", $content, $matches);

答案 2 :(得分:0)

preg_match_all("/<a href\=\"\/title\/.*\/\">(.*?)<\/a>/", $content, $matches);

我会尝试:

preg_match_all('/<a href\=".title.*">(.*?)<\/a>/', $content, $matches);

为了简洁。