PHP清理已粘贴的Microsoft输入

9
我有一个网站,用户可以使用自定义的 TinyMCE 实现发布帖子(例如论坛、评论等)。许多用户喜欢从 Word 复制粘贴,这意味着他们的输入通常带有大量相关联的 MS 内联格式。
我不能仅仅去掉 <span whatever>,因为 TinyMCE 依赖于 span 标签进行一些格式化,并且我不能(也不想)强制用户使用 TinyMCE 的“从 Word 粘贴”功能(无论如何,这个功能似乎不太好用)。
是否有人知道一个库/类/函数可以为我解决这个问题?虽然我找不到任何确定的东西,但这一定是一个常见的问题。我最近一直在思考,寻找 MS 特定模式的暴力正则表达式可能会解决这个问题,但我不想重新编写已经存在的代码,除非必须。
此外,修复引号、破折号等也很重要。我现在有自己的工具来完成这项工作,但我真的只想找到一个 MS 转换过滤器来解决所有问题。
4个回答

7

HTML Purifier可以创建符合标准的标记并过滤掉许多可能的攻击(如XSS)。

对于不需要XSS过滤的更快速的清理,我使用PECL扩展Tidy,它是Tidy HTML实用程序的绑定。

如果这些都无法帮助您,我建议您切换到FCKEditor,它具有此功能内置


谢谢,但是这两个似乎都无法处理MS格式,这正是我主要关注的。HTML Purifier计划在3.5版本中实现,但需要进行“必要的研究”。 - da5id
那我建议你切换到 fckeditor,它可以处理 Word 输入。我已经更新了我的答案。 - Eran Galperin
嗯。以前我因为其他原因更喜欢TinyMCE而不是FCKeditor,但这可能会改变我的看法。感谢您的提示,很高兴接受我的+1 :) - da5id
2
请注意,FCKEditor已不再得到支持,而且在现代浏览器中可能会出现问题,所以您应该使用CKEditor。http://ckeditor.com/ - Kaivosukeltaja
只是一点提醒,Tidy确实可以处理MS格式,并且已经有好几年了。我曾经在4-5年前使用它来清除粘贴的MS Word内容... http://tidy.sourceforge.net/docs/quickref.html#word-2000 - Jon L.
显示剩余2条评论

1
在我的情况下,这个方法完美地运行了:

$text = strip_tags($text, '<p><a><em><span>');

相比于试图删除不需要的内容,如嵌入的Word XML,您可以只指定允许的标签。

0

网站http://word2cleanhtml.com/ 在从Word转换方面做得很好。我正在使用PHP进行网页抓取,以处理一些旧版的HTML,到目前为止效果非常不错(结果非常干净的<p>、<b>代码)。当然,作为外部服务,它不适合像您这样的在线处理。

如果您尝试它并出现了许多400错误,请先使用Tidy过滤HTML。


0
在我的情况下,有一个模式。不需要的部分总是以...开头。
<!-- [if gte mso 9]>

结束
<![endif]-->

所以我的解决方案是剪切掉这个块之前和之后的所有内容:

$array = explode("<!-", $string, 2);
$begin = $array[0];
$end=substr(strrchr($string,'[endif]-->'),10);
echo $begin.$end;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接