Php RegExp练习:带有先行断言的不情愿量词

Php RegExp练习:带有先行断言的不情愿量词,php,regex,lookahead,reluctant-quantifiers,Php,Regex,Lookahead,Reluctant Quantifiers,你能解释一下这是怎么回事吗?以下是一个例子: <!-- The quick brown fox jumps over the lazy dog --> <!--[if IE 7]> <link rel="stylesheet" type="text/css" href="/supersheet.css" /> <![endif]--> <!-- Pack my box with five dozen

你能解释一下这是怎么回事吗?以下是一个例子:

<!-- The quick brown fox 
              jumps over the lazy dog -->

<!--[if IE 7]>
    <link rel="stylesheet" type="text/css" href="/supersheet.css" />
<![endif]-->

<!-- Pack my box with five dozen liquor jugs -->
它工作正常,完全符合我的需要。但是,以下正则表达式也可以工作:

/<!--(?=.*stylesheet).*?-->/s
相同,但末尾有
s
修饰符:

/<!--(?:(?!<!).)+?stylesheet.+?-->/s
//s
正如我所说,这是一个很好的解决方案,但我设法改进了模式,并找到了另一个在我的情况下工作更快的解决方案

因此,最终的解决方案如下:

/<!--(?:(?!-->).)+?stylesheet.+?-->/s
/)+?样式表+?-->/s

感谢所有参与者提供了有趣的答案。

字符串
样式表在您的测试文档中只提到过一次,因此您尝试的两个正则表达式将以不同的方式匹配相同的内容

<!--(?=.*?stylesheet).*?-->/s
这一个执行以下操作:

/<!--(?:(?!-->).)+?stylesheet.+?-->/s
  • 捕获
基本上,一个需要显著回溯,而另一个不需要

如果你的主题是

<!-- The quick brown fox jumps over the lazy dog --> <!--[if IE 7]> <link rel="stylesheet" type="text/css" href="/supersheet.css" /> <![endif]--> <!-- Pack my box with five dozen stylesheets -->
你会得到两个不同的结果。前者将查找第一个
样式表,而后者将查找第二个(和最后一个),因为它从字符串的末尾开始搜索。

要仅匹配部分
,有许多方法:

1.)使用连字符
[^-]
限制匹配,并保持在
之间)


3.)使用a缩小范围通常成本更高:

(?s)<!--(?:(?!<!).)+?stylesheet.+?-->
(?s)

看<代码>(?!如果您想匹配
,请查看
之间的每个字符。或者放置一个贪婪的点,在之前吃掉,然后在之后重置,或者使用捕获组。您可以扩展您的答案吗?我想这对其他人和我都很有趣。非常有趣的答案!谢谢,@Anonymous!找到了解决方案。请,s请参阅更新的帖子。@Mr.twister欢迎!我阅读了您的更新-第二个解决方案对于您的输入速度较慢。实际上,这应该相当快。取决于输入。我进行了编辑,并添加了一个
^
开始到第二个解决方案,以避免不必要的回溯。在许多情况下,前瞻解决方案会较慢。您对
(?!-->)。
很好-更具体。
<!--(?=.*stylesheet).*?-->/s
<!-- The quick brown fox jumps over the lazy dog --> <!--[if IE 7]> <link rel="stylesheet" type="text/css" href="/supersheet.css" /> <![endif]--> <!-- Pack my box with five dozen stylesheets -->
(?s)<!--[^-]+stylesheet.+?-->
(?s)^.*\K<!--.+?stylesheet.+?-->
(?s)<!--(?:(?!<!).)+?stylesheet.+?-->