• 技术文章 >后端开发 >php教程

    php使HTML标签自动补全闭合函数代码

    高洛峰高洛峰2016-12-01 14:58:06原创886
    简单解释一些代码:
    第一个 ~(<[^>]+?>)~si
    这个正则是匹配<………>中的内容。简单说是所有的<标签>。
    第二个 ~<([a-z0-9]+)[^/>]*?/>~si
    这个正则是匹配<……/>中的内容。是单闭合标签 如<br />
    第三个 ~</([a-z0-9]+)[^/>]*?>~si
    这个正则是匹配</......>中的内容。也就是结束标签 如</a>
    第四个 ~<([a-z0-9]+)[^/>]*?>~si
    匹配<......>中的内容。这和第一个是不一样的,这一个是真正的html标签,因为html标签只有数字和字母,如:<h1></h1>
    第五个 ~<!--.*?-->~si
    不用解释了,HTMl的注释
    剩下的可以看源代码了,php源码附件:
    复制代码 代码如下:
    <?php
    /**
    * 取HTML,并自动补全闭合
    *
    * param $html
    *
    * param $length
    *
    * param $end
    */
    function subHtml($html, $length=50) {
    $result = '';
    $tagStack = array();
    $len = 0;
    $contents = preg_split("~(<[^>]+?>)~si", $html, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
    foreach($contents as $tag) {
    if (trim($tag) == "") continue;
    if (preg_match("~<([a-z0-9]+)[^/>]*?/>~si", $tag)) {
    $result .= $tag;
    } else if (preg_match("~</([a-z0-9]+)[^/>]*?>~si", $tag, $match)) {
    if ($tagStack[count($tagStack)-1] == $match[1]) {
    array_pop($tagStack);
    $result .= $tag;
    }
    } else if (preg_match("~<([a-z0-9]+)[^/>]*?>~si", $tag, $match)) {
    array_push($tagStack, $match[1]);
    $result .= $tag;
    } else if (preg_match("~<!--.*?-->~si", $tag)) {
    $result .= $tag;
    } else {
    if ($len + mstrlen($tag) < $length) {
    $result .= $tag;
    $len += mstrlen($tag);
    } else {
    $str = msubstr($tag, 0, $length - $len + 1);
    $result .= $str;
    break;
    }
    }
    } while (!empty($tagStack)) {
    $result .= '</' . array_pop($tagStack) . '>';
    }
    return $result;
    }
    /**
    * 取中文字符串
    *
    * param $string 字符串
    *
    * param $start 起始位
    *
    * param $length 长度
    *
    * param $charset 编码
    *
    * param $dot 附加字串
    */
    function msubstr($string, $start, $length, $dot = '', $charset = 'UTF-8') {
    $string = str_replace(array('&', '"', '<', '>', ' '), array('&', '"', '<', '>', ' '), $string);
    if (strlen($string) <= $length) {
    return $string;
    }
    if (strtolower($charset) == 'utf-8') {
    $n = $tn = $noc = 0;
    while ($n < strlen($string)) {
    $t = ord($string[$n]);
    if ($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {
    $tn = 1;
    $n++;
    } elseif (194 <= $t && $t <= 223) {
    $tn = 2;
    $n += 2;
    } elseif (224 <= $t && $t <= 239) {
    $tn = 3;
    $n += 3;
    } elseif (240 <= $t && $t <= 247) {
    $tn = 4;
    $n += 4;
    } elseif (248 <= $t && $t <= 251) {
    $tn = 5;
    $n += 5;
    } elseif ($t == 252 || $t == 253) {
    $tn = 6;
    $n += 6;
    } else {
    $n++;
    }
    $noc++;
    if ($noc >= $length) {
    break;
    }
    }
    if ($noc > $length) {
    $n -= $tn;
    }
    $strcut = substr($string, 0, $n);
    } else {
    for($i = 0; $i < $length; $i++) {
    $strcut .= ord($string[$i]) > 127 ? $string[$i] . $string[++$i] : $string[$i];
    }
    }
    return $strcut . $dot;
    }
    /**
    * 得字符串的长度,包括中英文。
    */
    function mstrlen($str, $charset = 'UTF-8') {
    if (function_exists('mb_substr')) {
    $length = mb_strlen($str, $charset);
    } elseif (function_exists('iconv_substr')) {
    $length = iconv_strlen($str, $charset);
    } else {
    preg_match_all("/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-f][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/", $text, $ar);
    $length = count($ar[0]);
    }
    return $length;
    }
    $str = "<div><table>x<tr>1s<td>测试<td>124";
    echo subHtml($str);
    ?>

    php入门到就业线上直播课:查看学习

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:php
    上一篇:php全排列递归算法代码 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• 你知道如何用PHP实现多进程吗• PHP与MySQL连接的方法总结• 工具包分享:PHP实现滑块验证图片• 针对初学PHP者的疑难问答_PHP• 求大神解答!ajax处理php返回的xml文档的问题
    1/1

    PHP中文网