首页 > 编程语言 >php代码:判断一个html字符串标签不闭合(没有结束标记)

php代码:判断一个html字符串标签不闭合(没有结束标记)

时间:2023-01-29 14:34:03浏览次数:57  
标签:val 标签 闭合 si html result php stack

来源

代码

记录一个php的html标签自动闭合的函数代码
<?php
function fix_html_tags($input, $single_tags = array()) {
    $result = null;
    $stack = array();//标签栈
    $_single_tags = array('br', 'hr', 'img', 'input');//合理的单标签
 
    if ($single_tags && is_array($single_tags)) {
        $_single_tags = array_merge($_single_tags, $single_tags);
        $_single_tags = array_map('strtolower', $_single_tags);
        $_single_tags = array_unique($_single_tags);
    }
    //返回标签分隔之后的内容,包括标签本身
    $content = preg_split('/(<[^>]+>)/si', $input, null, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
 
    foreach ($content as $val) {
        //匹配未闭合的自闭合标签 如 <br> <hr> 等
        if (preg_match('/<(\w+)[^\/]*>/si', $val, $m) && in_array(strtolower($m[1]), $_single_tags) ) {
            $result .= "\r\n" . $val;
        }
        //匹配标准书写的自闭合标签,直接返回,不入栈
        else if (preg_match('/<(\w+)[^\/]*\/>/si', $val, $m)) {
            $result .= $val;
        }
        //匹配开始标签,并入栈
        else if (preg_match('/<(\w+)[^\/]*>/si', $val, $m)) {
            $result .= "\r\n" . str_repeat("\t", count($stack)) . $val;
            array_push($stack,  $m[1]);
        }
        //匹配闭合标签,匹配前先判断当前闭合标签是栈顶标签的闭合,优先闭合栈顶标签
        else if (preg_match('/<\/(\w+)[^\/]*>/si', $val, $m)) {
            //出栈,多余的闭合标签直接舍弃
            if (strtolower(end($stack)) == strtolower($m[1])) {
                array_pop($stack);
                $result .= $val;
            }
        } else {
            $result .= $val;
        }
    }
 
    //倒出所有栈内元素
    while ($stack) {
        $result .= "</".array_pop($stack).">";
        $result .= "\r\n";
    }
 
    return $result;
}
 
 
$str="<div>sdfsdf";
echo fix_html_tags($str);
?>

运行结果:

  • 该函数对于复杂的标签有缺陷,如字符串:"<a href=\"http://www.baidu.com\">test"。就不会正常补全剩余的结束标记</a>

另外一些搜索结果(都不是正确的,标记一下下次继续查找):https://www.oschina.net/informat/php+标签不闭合

标签:val,标签,闭合,si,html,result,php,stack
From: https://www.cnblogs.com/CodeWater404/p/17072600.html

相关文章

  • PHPMyWind编辑器支持pdf一键导入
    ​ 图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码目前限chrome浏览器使用首先以um-editor的二进制流保存为例:打开umeditor.j......
  • 在圣诞及元旦的日子里如何用html代码画一个爱心树
    一、前言在圣诞节以及元旦节日来临的日子里,如果能亲自为自己所爱的人画一个爱心树,这肯定是个很浪漫的事。那么如何用代码画出圣诞树呢?用我的办法就能很简单的实现,复制-粘贴-......
  • 如何用最简单的方法用html代码画出圣诞树
    一、前言在圣诞节以及元旦节日来临的日子里,如果能亲自为自己所爱的人画一个圣诞树,这肯定是个很浪漫的事。那么如何用代码画出圣诞树呢?用我的办法就能很简单的实现,复制-粘贴-......
  • php面试准备
    1.PHP如何处理网站的高并发、大流量、大存储问题https://www.qycn.com/xzx/article/5799.html2.50个php程序性能优化的方法,赶紧收藏吧!https://www.cnblogs.com/itbaby/p......
  • PHPMyWind编辑器支持pdf上传
    ​ 如何做到ueditor批量上传word图片?1、前端引用代码<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML1.0Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml......
  • PHPMyWind编辑器支持pdf自动上传
    ​ 自动导入Word图片,或者粘贴Word内容时自动上传所有的图片,并且最终保留Word样式,这应该是Web编辑器里面最基本的一个需求功能了。一般情况下我们将Word内容粘贴到Web编辑......
  • 黑马程序员前端-HTML+CSS之定位(position)的应用
     前端学习笔记教程不定期更新中,传送门:​​前端HTML第一天:什么是网页?什么是HTML?网页怎么形成?​​​​黑马程序员前端-CSS入门总结​​​​黑马程序员前端-CSS之emmet语法​......
  • Dedecms织梦TAG中文标签改成英文+数字地址的方法
    最近发现一些关于织梦的很多问题,特别是最新版本的织梦还不如老板的稳定好用,最大的问题就是织梦官方给出的新版本默认的TAG标签是中文的,所以很多人没注意到这一点,中文标签路......
  • PHP反序列化新手入门学习总结
    最近写了点反序列化的题,才疏学浅,希望对CTF新手有所帮助,有啥错误还请大师傅们批评指正。php反序列化简单理解首先我们需要理解什么是序列化,什么是反序列化?PHP序列化:seria......
  • 封面标签选择图片
    基本代码<el-form-itemlabel="文章封面"><!--用来显示封面的图片--><imgsrc="../../../assets/images/cover.jpg"......