【问题标题】:preg_match_all doesn't work as expectedpreg_match_all 没有按预期工作
【发布时间】:2012-10-19 18:45:54
【问题描述】:

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

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

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

【问题讨论】:

  • 很奇怪。您能否展示该正则表达式应涵盖的实际 HTML 示例?
  • 请不要使用正则表达式解析 HTML。使用 PHP DOM 模块。 htmlparsing.com/php.html

标签: php regex html-parsing


【解决方案1】:

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

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

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

希望对你有帮助。

【讨论】:

  • 这太好了。很多非常好的正则表达式技巧,最后三个在 php 之外也是可行的。这应该是公认的答案,如果它有效(我怀疑它确实有效)。
【解决方案2】:

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

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

【讨论】:

  • @Adam - 不需要转义=
【解决方案3】:
preg_match_all("/<a href\=\"\/title\/.*\/\">(.*?)<\/a>/", $content, $matches);

我会尝试:

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

为了简洁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-16
    • 2021-10-19
    • 2020-03-18
    • 2012-06-14
    • 2014-11-15
    • 1970-01-01
    • 2012-07-02
    • 2011-09-07
    相关资源
    最近更新 更多