PHP preg_replace:从img标签中删除style =“..”标签
我试图找到preg_replace的表达式,它删除图像的所有内嵌css样式。 例如,我有这样的文字:PHP preg_replace:从img标签中删除style =“..”标签
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)
,但毫无效果。有什么建议么?
正如有人评论,你应该使用DOM解析器,PHP有一个内置的(两人在某些情况下)叫DOM文档。这里是你如何使用它的目的。
$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");
我试着理解你提出的解决方案, m没有意识到DOMDocument,我不是一个PHP专家:)在yor代码中提到的HTML文件的路径。我的网站是动态创建页面(我使用joomla),并没有这样的事情作为特定路径如果我的问题是假的,对不起如果 – zekia
那么你可以使用$ x-> loadHTML($ htmlstring)发送你发送到preg_replace的任何字符串到DOMDocument对象中;在这个例子中的其他所有东西都是一样的。 –
您的模式太宽松。由于.
可以匹配任何内容,因此style(.*?)=(.*?)
会继续尝试匹配,直至找到包含=号的内容为止,其中包括您不需要的各种内容。您还没有使用g
或m
标志,我很确定您要使用它。
尝试这样:
preg_replace("/<img\s([^>]*)style\s*=\s*('|\").*?\2([^>]*)>/igm", "<img $1 $3>", $article->text)
注意('|")...\2
,这使得像style="foo 'bar'"
代码。这在style
标签中很有可能。
this可能是一个愚蠢的问题,但我怎么能使用你所建议的模式,而不会造成语法错误呢?应该是expre ssion被包裹在“”或“'中? – zekia
@ktsixit - 对不起,我的错。我很久没有使用PHP了,所以我没有正确包装它。不知道我在那里想什么。我编辑过;现在就试试。顺便说一句,请注意,我也在'('| \“)'中躲过了''''。 –
这样的事情呢?
preg_replace('/<img style="[^"]*"/', '<img ', $article->text);
如果'img'和'style'之间存在什么内容会发生什么? – afuzzyllama
@afuzzyllama非常好的一点!对我而言,这是一个疏忽! – Killian
使用HTML/XML解析库。试图用正则表达式解析HTML是一个错误。 – Hammerite