【问题标题】:How to preg_match all style tags? [duplicate]如何 preg_match 所有样式标签? [复制]
【发布时间】:2016-02-08 03:28:28
【问题描述】:

我如何安全匹配所有 <style> 使用 preg_match_all() 在正文中的块?

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);

不起作用,因为它与样式注释中的

【问题讨论】:

  • Regex 不是安全处理 HTML 的好工具。

标签: php html regex preg-match-all


【解决方案1】:

正则表达式量词默认是贪婪的,这意味着它们尽可能匹配。要匹配尽可能少的字符,请通过在 .* 之后添加 ? 来将量词更改为惰性(也称为非贪婪):

preg_match_all('#<style>(.*?)</style>#is', $haystack, $matches, PREG_SET_ORDER);

您可以在此处阅读有关贪婪和惰性量词的更多信息:

http://php.net/manual/en/regexp.reference.repetition.php

最好使用 HTML 解析器,因为您的正则表达式可能无法匹配您遇到的所有 HTML。例如,上述正则表达式不适用于&lt;style type="text/css"&gt;。您可以将正则表达式更改为 &lt;style[^&gt;&lt;]*&gt; 之类的内容,但如果可以的话,最好使用 HTML 解析器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 2022-08-17
    • 2015-09-09
    • 2011-04-01
    • 2018-12-04
    • 2015-10-04
    • 2014-06-22
    相关资源
    最近更新 更多