PHP preg_replace:从img标签中删除style =“..”

时间:2011-07-29 15:34:33

标签: php regex image coding-style preg-replace

我正在尝试为preg_replace找到一个表达式,它删除图像的所有内联css样式。 例如,我有这样的文字:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. <img style="float:left; margin:0 0 10px 10px;" src="image.jpg" /> Proin vestibulum libero id nisl dignissim eu sodales.

我需要让它看起来像:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. <img src="image.jpg" /> Proin vestibulum libero id nisl dignissim eu sodales.

我尝试过几十个像

这样的表达式
preg_replace("%<img(.*?)style(.*?)=(.*?)(\'|\")(.+?)(\'|\")(.*?)>%i", "<img\$1\$7>", $article->text)

但没有任何效果。有什么建议吗?

4 个答案:

答案 0 :(得分:6)

preg_replace('/(\<img[^>]+)(style\=\"[^\"]+\")([^>]+)(>)/', '${1}${3}${4}', $article->text)

这可以帮助

答案 1 :(得分:3)

如评论所述,您应该使用dom解析器,PHP内置一个(在某些情况下为两个)名为DOMDocument。以下是您如何将它用于您的目的。

$x = new DOMDocument();
    $x->loadHTMLFile("/path/to/html/file/or/file/outputtinghtml.html");
    foreach($x->getElementsByTagName('img') as $img)
    {
    $img->removeAttribute('style');
    }
$x->saveHTMLFile("/file/used/in/loadHTMLFile/function.html");

答案 2 :(得分:1)

你的模式过于宽松。由于.可以匹配任何内容,style(.*?)=(.*?)会继续尝试匹配,直到它遇到包含=符号的内容,包括您不想要的各种内容。您也没有使用gm标记,我非常确定您要使用这些标记。

尝试这样的事情:

preg_replace("/<img\s([^>]*)style\s*=\s*('|\").*?\2([^>]*)>/igm", "<img $1 $3>", $article->text)

请注意('|")...\2,其中包含style="foo 'bar'"等代码。这在style代码中非常有用。

答案 3 :(得分:0)

这样的事情怎么样?

preg_replace('/<img style="[^"]*"/', '<img ', $article->text);