我正在考虑添加一个富文本编辑器,以允许非程序员更改文本的方面。但是,有一个问题是,如果标记不正确,则可能会扭曲呈现页面的布局。什么是一种很好的轻量级方法来消毒html?
答案 0 :(得分:18)
您必须在优质和轻量级之间做出决定。推荐的选择是'HTMLPurifier',因为它提供了毫不费力的安全默认值。作为更快的替代方案,通常建议使用“htmLawed”。
另请参阅HTMLPurifier作者的这篇非常客观的概述:http://htmlpurifier.org/comparison
答案 1 :(得分:6)
我非常喜欢HTML Purifier,它允许您指定HTML代码中允许的标签和属性 - 并生成有效的HTML。
答案 2 :(得分:2)
使用BB代码(或类似于此处的SO),否则机会非常渺茫。 功能示例......
function parse($string){
$pattern = array(
"/\[url\](.*?)\[\/url\]/",
"/\[img\](.*?)\[\/img\]/",
"/\[img\=(.*?)\](.*?)\[\/img\]/",
"/\[url\=(.*?)\](.*?)\[\/url\]/",
"/\[red\](.*?)\[\/red\]/",
"/\[b\](.*?)\[\/b\]/",
"/\[h(.*?)\](.*?)\[\/h(.*?)\]/",
"/\[p\](.*?)\[\/p\]/",
"/\[php\](.*?)\[\/php\]/is"
);
$replacement = array(
'<a href="\\1">\\1</a>',
'<img alt="" src="\\1"/>',
'<img alt="" class="\\1" src="\\2"/>',
'<a rel="nofollow" target="_blank" href="\\1">\\2</a>',
'<span style="color:#ff0000;">\\1</span>',
'<span style="font-weight:bold;">\\1</span>',
'<h\\1>\\2</h\\3>',
'<p>\\1</p>',
'<pre><code class="php">\\1</code></pre>'
);
$string = preg_replace($pattern, $replacement, $string);
$string = nl2br($string);
return $string;
}
...
echo parse("[h2]Lorem Ipsum[/h2][p]Dolor sit amet[/p]");
结果...
<h2>Lorem Ipsum</h2><p>Dolor sit amet</p>
或者只使用HTML Purifier:)
答案 3 :(得分:1)
HTML Purifier和htmLawed都很好。 htmLawed具有占地面积小,可配置性高的优点。除了执行平衡标签,过滤特定HTML标签或其属性或属性内容(通过白色或黑色列表)等标准工作外,它还允许使用自定义功能。
答案 4 :(得分:0)
使用 HTML Sanitizer API 很容易:
words = [['Hi'], ['From'], ['Python']]
with open('mypage.html', 'w') as myFile:
myFile.write('<html>')
myFile.write('<body>')
myFile.write('<h1>---------------------------</h1>')
# 2-depth string data to 1-depth
words = [word_str for inner in words for word_str in inner]
# use fstring to build string
for word in words:
myFile.write(f'<tr><td>{word}</td></tr>')
myFile.write('</body>')
myFile.write('</html>')