HTML 标签 补全

项目 截取html字符串问题  截取一部分正文 文章正文翻页截取
如果不先去掉html标签 直接截取出来的字符串就会有没有闭合的标签出现 会截取在标签

产生了没有闭合的标签 直接显示到页面上面就会破坏页面布局   
想了很久 也找了网上很多 closetag函数 但是发现都针对第一页那种没有闭合的标签的闭合 对于第二种没有开头的标签就没办法了
针对第一页那种没有闭合的标签的闭合的closetags方法是:
function closetags($html) {// 不需要补全的标签
$arr_single_tags = array('meta', 'img', 'br', 'link', 'area');// 匹配开始标签
preg_match_all('#<([a-z]+)(?: .*)?(?<![/|/ ])>#iU', $html, $result);
$openedtags = $result[1];// 匹配关闭标签
preg_match_all('#</([a-z]+)>#iU', $html, $result);
$closedtags = $result[1];// 计算关闭开启标签数量 如果相同就返回html数据
$len_opened = count($openedtags);
if (count($closedtags) == $len_opened) {return $html;}// 把排序数组 将最后一个开启的标签放在最前面
$openedtags = array_reverse($openedtags);// 遍历开启标签数组
for ($i = 0; $i < $len_opened; $i++) {// 如果需要补全的标签
if (!in_array($openedtags[$i], $arr_single_tags)) {// 如果这个标签不在关闭的标签中
if (!in_array($openedtags[$i], $closedtags)) {// 直接补全闭合标签
$html .= '</' . $openedtags[$i] . '>';
} else {
unset($closedtags[array_search($openedtags[$i], $closedtags)]);
}
}
}
return $html;
}
后来想了一个办法 利用浏览器自己的html解释引擎来帮助补全有问题的html片段 具体做法如下:
<script>
var div = document.createElement('div');
div.innerHTML ='<?php echo ("<div>这里是被截取的html片段");?>';
document.write(div.innerHTML);
</script>


原理就是先把html片段写入到一个空的div里面 然后再从这个div里面读取出来
写入的内容和得到的内容是不一样的
如果写入不完整的html片段
浏览器会自动补全修正
读取出来的时候就已经是完整的html dom 片段了