【问题标题】:Regular expression a little too greedy正则表达式有点太贪心了
【发布时间】:2013-02-12 07:34:49
【问题描述】:

我正在尝试使用此 RegEx 捕获文档的一小部分:

preg_match('/href="(.+?)".+?>Keyword/s', $a, $b);

但是,它不是直接在Keyword 之前抓取href=,而是从文档中的第一个href= 开始,然后allllll一直到Keyword

我怎样才能使它回溯并仅在Keyword之前保留href=

【问题讨论】:

  • 如果整个东西在 1 行,你可以去掉 s 标志
  • 很遗憾不是=(

标签: php regex regex-greedy


【解决方案1】:

如果在输入中,被锚标签包围的文本与标签在同一行,可以去掉s标志。

否则,您需要更具体的正则表达式:

'/href="[^"]*"[^<>]*>Keyword/'

这假定href 中的链接不包含"[^&lt;&gt;] 防止其他标签成为匹配的一部分。

【讨论】:

  • 不完全确定为什么会这样,但它似乎解决了贪婪问题。谢谢。
  • @RyanPeschel:你的正则表达式可以跨越多个标签,因为 &lt;&gt; 永远不会被禁止,而且 href 属性中的正则表达式过于宽松。我只确保 &lt;&gt; 被禁止,并且 href 属性被正确关闭。
  • 您应该可以省略[^&lt;&gt;]*,因为引用已经禁用匹配其他标签。这仅在您的文档看起来像 href="mylink"&gt;myKeyword 时才有效。如果不保留 nhahtdh 的解决方案。
  • @LucasHoepner:不,引用不会阻止匹配其他标签 - (.+?) 将匹配任何内容。并且正则表达式可以匹配href="link" onclick="..."&gt;Keyword
  • “省略” - 不是“替换为 (.+?)” ;)
【解决方案2】:

假设" 不能包含在href 属性中,您可以开始调整您的正则表达式:

preg_match('/href="([^"]+?)".+?>Keyword/s', $a, $b);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多