1

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

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

我检查了 $content,它是正确的。那么我的陈述有什么问题吗?谢谢!

4

3 回答 3

7

拜托,拜托...看在上帝的份上,不要将处理 URL 或 HTML 的正则表达式包装在 / 中。你必须到处逃避它。它是可怕的。看这里:

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

有更多方法可以改善这一点,但应该这样做。

希望能帮助到你。

于 2012-10-19T19:15:23.390 回答
1

?您需要通过添加>>使您的正则表达式模式变得懒惰(非贪婪)

preg_match_all("/<a href=\"\/title\/.*?\/\">(.*?)<\/a>/", $content, $matches);
于 2012-10-19T18:50:45.590 回答
0
preg_match_all("/<a href\=\"\/title\/.*\/\">(.*?)<\/a>/", $content, $matches);

我会尝试:

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

为简洁起见。

于 2012-10-19T18:47:38.150 回答