2011-07-29 86 views
0

我试图找到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) 

,但毫无效果。有什么建议么?

+2

使用HTML/XML解析库。试图用正则表达式解析HTML是一个错误。 – Hammerite

回答

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

这将有助于

+0

我尝试了你建议的表达式,但它似乎删除了整个图像 – zekia

+0

我不得不用引号包装表达式才能使其工作。声明的正确形式为:preg_replace('/(\ )+)(style \ = \“[^ \”] + \“)([^>] +)(>)/','$ {1 } $ {3} $ {4}',$ text); – zekia

+0

对不起... –

3

正如有人评论,你应该使用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"); 
+0

我试着理解你提出的解决方案, m没有意识到DOMDocument,我不是一个PHP专家:)在yor代码中提到的HTML文件的路径。我的网站是动态创建页面(我使用joomla),并没有这样的事情作为特定路径如果我的问题是假的,对不起如果 – zekia

+0

那么你可以使用$ x-> loadHTML($ htmlstring)发送你发送到preg_replace的任何字符串到DOMDocument对象中;在这个例子中的其他所有东西都是一样的。 –

1

您的模式太宽松。由于.可以匹配任何内容,因此style(.*?)=(.*?)会继续尝试匹配,直至找到包含=号的内容为止,其中包括您不需要的各种内容。您还没有使用gm标志,我很确定您要使用它。

尝试这样:

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

注意('|")...\2,这使得像style="foo 'bar'"代码。这在style标签中很有可能。

+0

this可能是一个愚蠢的问题,但我怎么能使用你所建议的模式,而不会造成语法错误呢?应该是expre ssion被包裹在“”或“'中? – zekia

+1

@ktsixit - 对不起,我的错。我很久没有使用PHP了,所以我没有正确包装它。不知道我在那里想什么。我编辑过;现在就试试。顺便说一句,请注意,我也在'('| \“)'中躲过了''''。 –

0

这样的事情呢?

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

如果'img'和'style'之间存在什么内容会发生什么? – afuzzyllama

+0

@afuzzyllama非常好的一点!对我而言,这是一个疏忽! – Killian