1

我正在尝试匹配所有以 . 开头"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';
4

2 回答 2

2

您可以使用 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 修饰符,因为不使用点。

于 2013-07-10T01:12:15.703 回答
1

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

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

雷伊

于 2013-07-10T04:10:08.070 回答