js版本
var aa = '<div class="default">无反斜杠包裹'
var lsdiv = document.createElement("div");
lsdiv.innerHTML = aa;
setTimeout(function(){
//必须延迟
console.log(lsdiv.innerHTML);
},200);
php 自带扩展版本
$html = '<div id="one" style="color:#000">123中文"';
$doc = new DOMDocument();
$doc->loadHTML('<!--ii -->'.$html,LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD|LIBXML_NOWARNING|LIBXML_NOERROR |LIBXML_NONET);
$doc = $doc->saveHTML();
echo $doc;
#php 版本2 原生算法代码
/**
* @Description: html 自动闭合 #再也不用正则写复杂算法了 调试问题调怕了
* @Author: LingMax[xiaohxx@qq.com]
* @Date: 2019-10-30 15:30:13
* @param string $html html
* @param int $len 闭合搜寻附近的标签次数 默认3个 最小1
* @return: string
*/
public function subHtml($html,$len = 3)
{
#去除注释
#$html = preg_replace('~<!--(?:.|\r|\n)+?-->','',$html);
$result = '';
$tagStack = array();
$contents = preg_split('~(<!--(?:.|\r|\n)*?-->|<[\s\r\n]*script(?:.|\r|\n)+?<[\s\r\n]*/[\s\r\n]*script[\s\r\n]*>|<[\s\r\n]*/?[\s\r\n]*[a-z0-9]+(?:[^\'">]*?([\'"])(?:\\\\\2|(?!\2).)*?\2)*[^\'">]*>)~si', $html, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
foreach ($contents as $kkk => $tag) {
if ($tag == "" || $kkk-1 >= 0 && ($tag == "'" || $tag == '"') && preg_match('~^<[\s\r\n]*([a-z0-9]+)[\s\r\n]*(?:[^\'">]*?([\'"])(?:\\\\\2|(?!\2).)*?\2)+[^\'">]*>$~si', $contents[$kkk-1], $match) ) continue;
$reg = '^<!--(?:.|[\r\n])*?-->$|^<[\s\r\n]*(?:input|img|isindex|area|base|basefont|bgsound|col|embed|frame|keygen|link|meta|nextid|param|plaintext|spacer|wbr|br)(?:[^\'">]*?([\'"])(?:\\\\\1|(?!\1).)*?\1)*?[^\'">]*>$';
#增加兼容自定义标签 <img1x src="" /> by:LingMax
#$reg .= '|^<[\s\r\n]*[a-z0-9]+(?:(?:[^\'">]*?)([\'"])(?:\\\\\2|(?!\2).)*?\2)*?[^\'">]*/[\s\r\n]*>$';
if (preg_match('~'.$reg.'~si', $tag)) {
$result .= $tag;#放行 img这种自带闭合的标签
} else if (preg_match("~^<[\s\r\n]*/[\s\r\n]*([a-z0-9]+)[\s\r\n]*>$~si", $tag, $match)) {
$arrb = $tagStack;
$bz = false;
$lsstr = '';
for ($i=0; $i < $len; $i++) {
$ls = array_pop($arrb);
if($ls == $match[1]){
$lsstr .= $tag;
$bz = true;
break;
}else{
#出现标签闭合问题 需要修补
$lsstr .= '<!--修补--></'.$ls.'>';
#array_push($tagStack, $ls);
}
}
if($bz){
$tagStack = $arrb;
$result .= $lsstr;
}else{
$result .= '<!--放弃'.$tag."-->";
}
} else if (preg_match('~^<[\s\r\n]*([a-z0-9]+)[\s\r\n]*(?:[^\'">]*?([\'"])(?:\\\\\2|(?!\2).)*?\2)*[^\'">]*>$~si', $tag, $match)) {
array_push($tagStack, $match[1]);
$result .= $tag;
}else {
$result .= $tag;
}
}
while (!empty($tagStack)) {
$result .= '</' . array_pop($tagStack) . '>';
}
return $result;
}