html 标签 自动闭合 无反斜杠包裹 自动修复 自动包裹 原生代码 函数

本文探讨了使用JavaScript和PHP处理HTML字符串的多种方法,包括自动闭合标签的算法,展示了如何在JS中利用innerHTML属性及setTimeout进行延迟操作,以及在PHP中使用DOMDocument进行HTML解析和自定义标签闭合的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值