如何preg_match所有样式标签?
How to preg_match all style tags?
如何使用 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);
无效,因为它与样式注释中的 < 匹配。
正则表达式量词默认是贪婪的,这意味着它们会尽可能匹配。要匹配尽可能少的字符,请通过在 .*
之后添加 ?
将量词更改为惰性(也称为非贪婪):
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 解析器。
如何使用 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);
无效,因为它与样式注释中的 < 匹配。
正则表达式量词默认是贪婪的,这意味着它们会尽可能匹配。要匹配尽可能少的字符,请通过在 .*
之后添加 ?
将量词更改为惰性(也称为非贪婪):
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 解析器。