如何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 解析器。