preg_replace函数任何风格标签的表达(preg_replace any style tag

2019-10-20 10:40发布

我想使用的preg_replace删除包含在风格标签的任何事情。 例如:

<img src="image.jpg" style="float:left;" />

将改为:

<img src="image.jpg" />

同样:

<a href="link.html" style="color:#FF0000;" class="someclass">Link</a>

将改为:

<a href="link.html" class="someclass">Link</a>

我怎么会写这个正则表达式?

preg_replace('EXPRESSION', '', $string);

Answer 1:

这应该工作:

preg_replace("@(<[^<>]+)\sstyle\=[\"\'][^\"\']+[\"\']([^<>]+>)@i", '$1$2', $string);


Answer 2:

我建议使用合适的工具才行,而避免使用正则表达式。

$dom = new DOMDocument;  
$dom->loadHTML($html); 

$xpath = new DOMXPath($dom);  

foreach ($xpath->query('//*[@style]') as $node) {
    $node->removeAttribute('style'); 
}

echo $dom->saveHTML(); 

工作演示

如果必须使用正则表达式完成这个任务,下面就足够了。

$html = preg_replace('/<[^>]*\Kstyle="[^"]*"\s*/i', '', $html);

说明

<           # '<'
[^>]*       # any character except: '>' (0 or more times)
 \K         #  resets the starting point of the reported match
 style="    #  'style="'
  [^"]*     #    any character except: '"' (0 or more times)
  "         #    '"'
\s*         # whitespace (\n, \r, \t, \f, and " ") (0 or more times)

工作演示



Answer 3:

寻找style="..."是封闭的内部<>并将其替换匹配的组$1$2

(<.*)style="[^"]*"([^>]*>)

在线演示


这里是工作示例代码

示例代码:

<?php
    $re = "/(<.*)style=\"[^\"]*\"([^>]*>)/";
    $str = "<img src=\"image.jpg\" style=\"float:left;\" />\n\n<a href=\"link.html\" style=\"color:#FF0000;\" class=\"someclass\">Link</a>";
    $subst = '$1$2';

    $result = preg_replace($re, $subst, $str);
    print $result;
?>

输出:

<img src="image.jpg"  />

<a href="link.html"  class="someclass">Link</a>


Answer 4:

这是最好的我能想出

$re = "/\sstyle\=('|\").*?(?<!\\\\)\1/i";
$str = "<a href=\"link.html\" style=\"color:#FF0000;\"\" class=\"someclass\">Link</a>";
$subst = '';

$result = preg_replace($re, $subst, $str, 1);

输出

<a href="link.html" class="someclass">Link</a>

演示:

http://regex101.com/r/uW2kB8/8

说明:

   \s match any white space character [\r\n\t\f ]
style matches the characters style literally (case insensitive)
\= matches the character = literally
1st Capturing group ('|")
    1st Alternative: '
        ' matches the character ' literally
    2nd Alternative: "
        " matches the character " literally
.*? matches any character (except newline)
    Quantifier: Between zero and unlimited times, as few times as possible, expanding as needed [lazy]
(?<!\\) Negative Lookbehind - Assert that it is impossible to match the regex below
    \\ matches the character \ literally
\1 matches the same text as most recently matched by the 1st capturing group
i modifier: insensitive. Case insensitive match (ignores case of [a-zA-Z])

这甚至会处理这样的情况。

<a href="link.html" style="background-image:url(\"..\somimage.png\");" class="someclass">Link</a>

<a href="link.html" style="background-image:url('..\somimage.png');" class="someclass">Link</a>

和(其它不会删除)

<a href="link.html" data-style="background-image:url('..\somimage.png');" class="someclass">Link</a>

乃至

<a href='link.html' style='color:#FF0000;' class='someclass'>Link</a>

http://regex101.com/r/uW2kB8/11

不像其他建议:)



文章来源: preg_replace any style tags expression