【问题标题】:How construct this regex to find multiline string ended with first occurrence of a string?如何构造这个正则表达式来查找以第一次出现的字符串结尾的多行字符串?
【发布时间】:2013-07-10 00:58:43
【问题描述】:

我正在尝试匹配所有以"id="SomeDiv"> 开头并以"<!-- someComment" 结尾的多行字符串。我的正则表达式不起作用,因为"<!-- someComment" 多次出现,所以它匹配所有内容,直到最后一次出现"<!-- someComment"。我只想匹配第一次出现。

这与最后一次匹配

'/id="SomeDiv">.*\<\!-- someComment/sim'

我也尝试了前瞻和后视(如下面的),但我没有得到任何结果。

这不匹配任何内容

'/id="SomeDiv">.*(?!\<\!-- someComment)<!-- someComment/sim'

我该如何正确匹配?

示例字符串

//The string to search in
$str = '<div id="SomeDiv>Some stuff in here<!-- someComment --> More stuff<!-- someComment -->';

//What I **should** find:
$expectedResult = 'id="SomeDiv>Some stuff in here<!-- someComment';

【问题讨论】:

  • @DanielGimenez 这似乎有效!您可以将此作为答案发布,以便我将其标记为已回答吗?谢谢!

标签: php regex


【解决方案1】:

您可以按照 Daniel Gimenez 的建议使用惰性量词,也可以使用以下技巧:

$pattern = '~id="SomeDiv"[^>]*+>\K(?>[^<]++|<(?!!--))*~';

解释:

\K                   # reset all that has been matched before
(?>                  # open an atomic group
    [^<]++           # all characters that are not <, one or more times
  |                  # OR
    <(?!!--)         # < not followed by !--
)*                   # close the group and repeat zero or more times

不需要捕获组,因为结果是整个匹配。请注意,也不需要 \s 修饰符,因为不使用点。

【讨论】:

    【解决方案2】:

    只需使用惰性量词。我添加了一个分组,以防您要查找的内容。

    id="SomeDiv">(.*?)<!-- someComment
    

    REY

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-31
      • 1970-01-01
      • 2021-11-03
      • 2015-11-07
      • 2018-02-01
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多