【问题标题】:PHP preg_match subpattern captures too much text (too greedy)PHP preg_match 子模式捕获太多文本(太贪心)
【发布时间】:2022-01-09 23:54:58
【问题描述】:

我正在使用 preg_match 来匹配某些 HTML 标记中的第一个联系人页面链接。

我花了很多时间调查、阅读 PHP 正则表达式文档、调试,并试图在 StackOverflow 上找到类似的解决方案。有很多关于正则表达式的建议,只是找不到特定于我的子模式问题的建议。

示例 HTML:-

<ul class='root dropdown'><li class="item1 current-item-root first-item current-item"><a href="/">Home</a></li><li class="item2"><a href="/contact-us">Contact Us</a></li><li class="item3 parent category-page"><a 

而不是返回

/contact-us 

返回

"/">Home</a></li><li class="item2"><a href="/contact-us

这里是代码:-

preg_match( '/href.{1,5}"(?P<link>.{0,50}contact.{0,20})"/isxU', $input_line, $output_array);

我希望正则表达式 U 设置使 {0,50} 不贪婪,但它抓取的文本过多。

该代码旨在获取各种格式的 href 链接,如下所示:-

/contact
/contact-us
websitename.com/contact-me

这是一个工作示例:- https://www.phpliveregex.com/p/Dh2

【问题讨论】:

  • 也许href=".*?\K(/?contact[^"]+)" 但需要定义您期望允许的内容,绝对的,相对的,两者兼而有之?此外,解析器会更好,这将不仅仅匹配链接。
  • 感谢您的回复和想法,尚未成功。我已经开始研究在子模式之外进行更好的匹配。我想知道的是为什么我的子模式抓取了这么多文本并且与 href 链接周围的双引号不匹配。例如,如果我将 {0,50} 减少到 {0,20),它会起作用,但它需要更大以适应所有情况。
  • 它适用于定义的用例。也许添加更多用例/示例。这是演示regex101.com/r/sxpj4I/1

标签: php regex web-scraping


【解决方案1】:

非常感谢您的帮助。答案是排除在子模式中捕获的任何其他引号,这是您示例的一部分。您的回答中最好和最精彩的部分是指导我使用 https://regex101.com/ 。这是一个非常棒的正则表达式工具,可以很好地突出显示和解释表达式。

我的回答:-

href="(?<link>[^"]{0,50}contact.*[^"]{0,50})"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 2013-09-03
    • 2021-05-28
    • 1970-01-01
    相关资源
    最近更新 更多