如何preg_match所有样式标签?

时间:2016-02-08 03:28:28

标签: php html regex preg-match-all

如何使用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;在风格评论中。

1 个答案:

答案 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解析器。