这里有一个简单的方法,你可以用DOM文档做到这一点,它不是完美的,但它可能会感兴趣:
<?php
function html_tidy($src){
libxml_use_internal_errors(true);
$x = new DOMDocument;
$x->loadHTML('<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />'.$src);
$x->formatOutput = true;
$ret = preg_replace('~<(?:!DOCTYPE|/?(?:html|body|head))[^>]*>\s*~i', '', $x->saveHTML());
return trim(str_replace('<meta http-equiv="Content-Type" content="text/html;charset=utf-8">','',$ret));
}
$brokenHTML[] = "<p><span>This is some broken html</spa";
$brokenHTML[] = "<poken html</spa";
$brokenHTML[] = "<p><span>This is some broken html</spa</p>";
/*
<p><span>This is some broken html</span></p>
<poken html></poken>
<p><span>This is some broken html</span></p>
*/
foreach($brokenHTML as $test){
echo html_tidy($test);
}
?>
虽然注意到Mike 'Pomax' Kamermans
的评论。
这听起来很傻,但最好的办法是做输入验证和拒绝超过400个字符的输入,所以这首先不会发生。如果客户可以输入您的代码无法处理的内容,请防止发生这种情况。 –
你需要字符串中的任何HTML吗?如果没有,也许你可以strip_tags http://php.net/manual/en/function.strip-tags.php编辑:你可以结合使用这个找到/如果得到一个替代结果不会strip_tags除非[条件]。 – redditor
只是删除损坏的结束标记不会有多大帮助:您仍然会打开标记。如果包含标签的标签可能也会丢失?考虑是试图重建缺失的标签,还是完全去除畸形的标签。这不是一个简单的问题,也不是 - 我没有答案。 – 2013-06-19 01:53:42