【问题标题】:PHP preg_replace: remove style=".." from img tags [duplicate]PHP preg_replace:从 img 标签中删除 style=".." [重复]
【发布时间】:2011-07-29 15:34:32
【问题描述】:

我正在尝试为 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)

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

【问题讨论】:

  • 使用 HTML/XML 解析库。尝试使用正则表达式解析 HTML 是错误的。

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


【解决方案1】:
preg_replace('/(\<img[^>]+)(style\=\"[^\"]+\")([^>]+)(>)/', '${1}${3}${4}', $article->text)

这会有所帮助

【讨论】:

  • 我尝试了你建议的表达方式,但它似乎删除了整个图像
  • 我必须将表达式用引号括起来才能使其工作。该语句的正确形式是:preg_replace('/(\]+)(style\=\"[^\"]+\")([^>]+)(>)/', '${1}${3}${4}', $text);
  • n.p.无论如何,在更正后它运行良好:) 谢谢你的帮助
【解决方案2】:

正如评论所说,您应该使用 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");

【讨论】:

  • 我试图了解您建议的解决方案。我不知道 DOMDocument 并且我不是 php 专家:) 你的代码中提到了 html 文件的路径。我的网站正在动态创建页面(我正在使用 joomla),并且没有特定 html 文件的路径之类的东西。对不起,如果我的问题是假的。
  • 好吧,您可以使用 $x->loadHTML($htmlstring); 将您发送到 preg_replace 的任何字符串发送到 DOMDocument 对象中。示例中的其他所有内容都相同。
【解决方案3】:

你的模式太放纵了。由于. 可以匹配任何东西,style(.*?)=(.*?) 将继续尝试匹配,直到它遇到带有 = 符号的东西,包括各种你不想要的东西。您也没有使用 gm 标志,我很确定您想使用它们。

试试这样的:

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

注意('|")...\2,它允许像style="foo 'bar'" 这样的代码。这在style 标签中是很有可能的。

【讨论】:

  • 这可能是一个愚蠢的问题,但我怎样才能使用您建议的模式而不会导致语法错误?表达式应该用 "" 还是 '' 包裹?
  • @ktsixit - 对不起,我的错。好久没用PHP了,所以没好好包装。不知道我在想什么。我已经编辑过;现在就试试。顺便说一句,请注意,我还逃脱了 ('|\") 中的 "
【解决方案4】:

这样的事情呢?

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

【讨论】:

  • 如果 'img' 和 'style' 之间有什么会发生什么?
  • @afuzzyllama 非常好!我有点疏忽了!
猜你喜欢
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
  • 2010-11-09
  • 2011-04-21
  • 2018-02-03
相关资源
最近更新 更多