PHP HTML strip_tags 除部分内容外全部删除标签内的样式

PHP HTML strip_tags all except some and remove styling from within tag

HTML 看起来像这样:

$html = 'SOME TEXT<p style="border-top: 0.0px;border-right: 0.0px;vertical-align: baseline;border-bottom: 0.0px;color: #000000;padding-bottom: 0.0px;padding-top: 0.0px;padding-left: 0.0px;margin: 0.0px;border-left: 0.0px;padding-right: 0.0px;background-color: #ffffff;">SOME TEXT';

我尝试 strip_tags($html, '<p>'); 删除除 <p> 之外的所有内容,但这保留了标签的所有样式元素。

我希望将上面的替换为 <p>

最好的方法是什么?

谢谢!

最简单的解决方案是基于 preg_replace()

$html = 'SOME TEXT<p style="border-top: 0.0px;border-right: 0.0px;vertical-align: baseline;border-bottom: 0.0px;color: #000000;padding-bottom: 0.0px;padding-top: 0.0px;padding-left: 0.0px;margin: 0.0px;border-left: 0.0px;padding-right: 0.0px;background-color: #ffffff;">SOME TEXT';
$html = strip_tags($html, '<p>');
$html = preg_replace('/\sstyle=["\'][A-Za-z0-9-:\s.;#]{1,}["\']/', '', $html);

一如既往,您在尝试使用正则表达式解析 html 时应始终小心谨慎。例如,如果由于某种原因 <p /> 标签内的文本包含格式类似于 css 样式的内容,这将失败。 (类似于 <p>If I typed style="color:red" inside the tags, it would also be removed</p>

为了使这样的事情变得更好,下一步是使用 DOMDocument class 将字符串实际解析为 XML 文档。这取决于您希望实现的功能集有多强大。但是,此方法可能会以意想不到的方式更改您的字符串;例如,将您的字符串解析为 DOMDocument 会导致添加 </p> 标记。这种验证可能对您有用,也可能没有用。

还有一些非常有用的时候会删除如下样式标签

`$html = '<style>li {
    list-style: none;
    background: url(/images/Articles/ordasoft_discount.png) no-repeat;
    padding-left: 30px;
}
li p{font-size:16px}
ul li {
    padding-left: 30px;}
.portfolio-container{width: 45%;}
</style> Hello word ';`

这会有所帮助:

`$html = preg_replace('/<style>[A-Za-z0-9-:\s.\/_;#\(\)\{\}%]{1,}<\/style>/', '',$html) ;`