如何使用preg_match_all()安全地匹配正文中的所有 <style>
块?
Google今天不是我的朋友。
$haystack = '<body>
<style>
.class {
foo: bar;
}
</style>
<p>Hello World</p>
<style>
/* A comment for <p> */
.class > p {
this: that;
}
</style>
<p>Some HTML</p>
</body>';
preg_match_all('#<style>([^<]+)#is', $haystack, $matches, PREG_SET_ORDER);
var_dump($matches);
preg_match_all('#<style>(.*)</style>#is', $haystack, $matches, PREG_SET_ORDER);
var_dump($matches);
没有用,因为它匹配&lt;在风格评论中。
答案 0 :(得分:1)
默认情况下,正则表达式量词是贪婪的,这意味着它们尽可能匹配。要匹配尽可能少的字符,请在?
之后添加.*
以便将以下内容更改为懒惰(也称为非贪婪):
preg_match_all('#<style>(.*?)</style>#is', $haystack, $matches, PREG_SET_ORDER);
您可以在此处阅读有关贪婪和懒惰量词的更多信息:
http://php.net/manual/en/regexp.reference.repetition.php
使用HTML解析器会更好,因为正则表达式可能与您遇到的所有HTML都不匹配。例如,上述正则表达式不适用于<style type="text/css">
。您可以将正则表达式更改为<style[^><]*>
,但如果可以的话,最好使用HTML解析器。