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.+?-->