使用php删除内联样式[重复]
Posted
技术标签:
【中文标题】使用php删除内联样式[重复]【英文标题】:Removing inline styles using php [duplicate] 【发布时间】:2011-01-30 03:27:33 【问题描述】:我正在使用 php 输出一些富文本。如何完全去除内联样式?
文本将直接从 MS Word 或 OpenOffice 中粘贴到使用 TinyMCE 的富文本编辑器中,该编辑器允许您将基本的 html 格式添加到文本中。 但是我想删除
上的内联样式标签(见下文),但保留
标记自己。
<p style="margin-bottom: 0cm;">A patrol of Zograth apes came round the corner, causing Rosette to pull Rufus into a small alcove, where she pressed her body against his. “Sorry.” She said, breathing warm air onto the shy man's neck. Rufus trembled.</p>
<p style="margin-bottom: 0cm;"> </p>
<p style="margin-bottom: 0cm;">Rosette checked the coast was clear and pulled Rufus out of their hidey hole. They watched as the Zograth walked down a corridor, almost out of sight and then collapsed next to a phallic fountain. As their bodies hit the ground, their guns clattered across the floor. Rosette stopped one with her heel and picked it up immediately, tossing the other one to Rufus. “Most of these apes seem to be dying, but you might need this, just to give them a helping hand.”</p>
【问题讨论】:
aper,重写你的问题!我完全不明白 您的输入是什么样的?是 XHTML 吗? 【参考方案1】:我很快把它放在一起,但是对于“内联样式”(!)你需要类似的东西
$text = preg_replace('#(<[a-z ]*)(style=("|\')(.*?)("|\'))([a-z ]*>)#', '\\1\\6', $text);
【讨论】:
@jakenoble - 这对我有用。但是当锚标签具有内联样式时它会中断。像 abc.com/abc.com">abc</a> 这也会影响 href 部分。请您帮忙。 在样式被转义时不起作用。它应该被重构以使其工作,或者 $text 应该被替换为 stripcslashes($text) 更精简的版本如下所示:(style=("|\Z)(.*?)("|\Z))
,但仅匹配 style=""
部分。
在 WordPress 内容上对我来说效果很好,谢谢@jake-n【参考方案2】:
这是我从 Crozin 的回答中得出的 preg_replace 解决方案。这允许在样式属性之前和之后使用锚标签修复问题。
$value = preg_replace('/(<[^>]*) style=("[^"]+"|\'[^\']+\')([^>]*>)/i', '$1$3', $value);
【讨论】:
很好的回应,接受的解决方案也可以,但在某些标签中删除了太多,如 a(它删除了 href 等属性)。这个解决方案更好 这个解决方案是最好的,因为它不仅会影响 1 个字母标签(p、a 等),还会影响其他标签(div、span 等)【参考方案3】:使用HtmlPurifier
【讨论】:
我可以使用第三方,但我希望有一个更简单的解决方案,比如使用一行正则表达式 当然。请注意风险 - 将使用正则表达式的边缘情况。【参考方案4】:你可以使用正则表达式:
$text = preg_relace('#<(.+?)style=(:?"|\')?[^"\']+(:?"|\')?(.*?)>#si', '<a\\1 \\2>', $text);
【讨论】:
看到这个***.com/questions/1732348/… 谢谢,但那行不起作用。我得到错误:解析错误:语法错误,意外的'[' in ...(等文件名) 我忘记在'
之前添加转义字符;)
嗨 Crozin,不确定我应该在哪里添加转义字符?你是说 \ 吗?
@Alon,请参阅该页面上的第二个答案:***.com/questions/1732348/…。他有一些已知的 HTML 可以可靠地生成,因此正则表达式在这里不是一个糟糕的解决方案。【参考方案5】:
也可以使用PHP Simple HTML DOM Parser,如下:
$html = str_get_html(SOME_HTML_STRING);
foreach ($html->find('*[style]') as $item)
$item->style = null;
【讨论】:
【参考方案6】:你可以使用:$content = preg_replace('/style=[^>]*/', '', $content);
【讨论】:
【参考方案7】:你不能只使用 strip_tags 并留下你想要的标签,例如<p>, <strong>
等吗?
【讨论】:
不,因为我想保留标签,但我不想要任何带有内联样式的标签,例如
这是我的内联样式想要删除而不删除
【参考方案8】:为什么不直接覆盖标签。因此,您将拥有没有内联样式的干净标签。
【讨论】:
【参考方案9】:我发现这个类对于处理带状属性非常有用(尤其是在整个文本中都有疯狂的 MS Word 格式):
http://semlabs.co.uk/journal/php-strip-attributes-class-for-xml-and-html
【讨论】:
正确更新链接semlabs.co.uk/blog/php-strip-attributes-class-xml-html【参考方案10】:我确实需要从 img 标签中清除样式并通过此代码解决:
$text = preg_replace('#(<img (.*) style=("|\')(.*?)("|\'))([a-z ]*)#', '<img \\2\\6', $text);
echo $text;
【讨论】:
以上是关于使用php删除内联样式[重复]的主要内容,如果未能解决你的问题,请参考以下文章