php截取html字符串

php截取带html的字符串函数,保持html标签的完整性,并考虑标签有嵌套的情况。

实现方法:1.使用preg_split()函数将要截取的字符串按标签分割成数组。

     2.遍历数组,如果是起始标签则放入存放起始标签的栈中;如果是结束标签则放入结束标签的栈中;如果是字符串则统计字符串长度。

       3.判断字符串长度是否大于等于要截取的长度,若是则标记当前位置,计算并截取遍历的数组得到要截取的字符串。

     4.统计起始和结束标签的栈长,起始标签数减去结束标签数就是可能要补全的标签数了,按这个长度截取起始标签数组就得到待补全的标签数组。

     5.遍历起待补全的标签数组,挨个取出标签(后进先出),判断是否为单一标签,是单一标签抛弃,不是则补全。

按字数计算,函数如下:

        /**
         * 截取带html标签的字符串
         * @param string $str   html字符串
         * @param int    $len   要截取的字数
         * @param string $re    结尾链接符
         * @return string
         */
        public static function cutHtmlStr($str, $len, $re = ‘...‘) {
            //$str = str_replace([‘&lt;‘, ‘&gt;‘], [‘<‘, ‘>‘], $str); //实体转html
            if (strLen($str) <= $len) {
                return $str;
            }
            $filterArr = [‘hr‘, ‘br‘, ‘img‘, ‘area‘]; //不需要补全的标签
            $l = 0;
            $startTag = $endTag = [];
            $arr = preg_split("/(<\!--.*-->|<[^>]*>)/s", $str, -1, PREG_SPLIT_DELIM_CAPTURE);
            for ($i = 0, $count = count($arr); $i < $count; $i++) {
                if ($arr[$i] && $arr[$i][0] == ‘<‘ && $arr[$i][1] != ‘/‘) {
                    $startTag[] = $arr[$i]; //起始标签
                    continue;
                } elseif ($arr[$i] && $arr[$i][0] == ‘<‘ && $arr[$i][1] == ‘/‘) {
                    $endTag[] = $arr[$i]; //结束标签
                    continue;
                } else {
                    $currStrLen = mb_strwidth($arr[$i], ‘GBK‘);
                    $l += $currStrLen;
                }

                //当前获取到的字符串长度大于$len
                if ($l >= $len) {
                    $str2 = mb_substr($arr[$i], 0, $len - $l + $currStrLen, ‘GBK‘);
                    $arr2Str = implode(‘‘, array_splice($arr, 0, $i));
                    $returnArr = [$arr2Str, $str2, $re];

                    //取出可能需要配对的标签
                    $j = count($startTag) - count($endTag);
                    if ($j == 0) {
                        break;
                    }
                    $htmlTagArr = array_splice($startTag, 0, $j);
                    for ($j--; $j >= 0; $j--) {
                        $re = preg_match(‘/<(\w+)(\s*.*)?>/i‘, $htmlTagArr[$j], $tagArr);
                        if ($re && !in_array($tagArr[1], $filterArr)) {
                            $returnArr[] = ‘</‘ . $tagArr[1] . ‘>‘;
                        }
                    }
                    break;
                }
            }
            return implode(‘‘, $returnArr);
        }
时间: 2024-10-16 18:49:16

php截取html字符串的相关文章

面试题之java 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 要求不能出现截半的情况

题目:10. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”. 一.需要分析 1.输入为一个字符串和字节数,输出为按字节截取的字符串-------------->按照字节[byte]截取操作字符串,先将String转换成byte类型 .2.汉字不可以截半----------------------------------

PHP截取中文字符串不出现?号的解决方法[原创]

PHP截取中文字符串不出现?号的解决方法[原创] 大 | 中 | 小 [不指定 2007-8-15 18:51 | by 张宴 ] [文章作者:张宴 本文版本:v1.0 最后修改:2007.08.15 转载请注明出处:http://blog.zyan.cc] 当PHP截取中英文混合字符串时,最后一个汉字经常被拆成两半,例:截取字符串的前18个字 view plainprint? <?php $text = "1欢迎访问sina新浪播客"; $value = substr($tex

php中计算中文字符串长度、截取中文字符串

在做PHP开发的时候,由于我国的语言环境问题,所以我们常常需要对中文进行处理.在PHP中,我们都知道有专门的mb_substr和mb_strlen函数,可以对中文进行截取和计算长度,但是,由于这些函数并非PHP的核心函数,所以,它们常常有可能没有开启.当然,如果是用的自己的服务器,则只要在php.ini中开启即可.如果是用的虚拟主机,而服务器又没有开启这方面的函数的话,那就需要我们自己写出点适合咱国情的函数来了. 以下几个函数用起来颇为顺手的.不过要知道,得在utf-8环境下使用. header

自定义一个函数截取中文字符串

/** * 截取中文字符串 * @param unknown $str 要截取的字符串 * @param unknown $encode 字符编码 * @param unknown $start 开始位置 * @param string $len 要截取的长度 * @return string */function getStr($str,$encode,$start,$len=null){ switch ($encode) { case 'utf8':$num = 3;break; case

C# 截取string字符串长度3种方法

/// <summary> /// 截取指定长度的字符串 /// </summary> /// <param name="str">要截取的字符串</param> /// <param name="len">要截取的长度</param> /// <param name="flag">截取后是否加省略号(true加,false不加)</param> //

JavaScript截取中英文字符串

有时在显示某段文字的时候,可能会太长,影响我们页面的显示效果.如果仅是英文,那么我们可以用String.substring(start, end)函数就已经够用了.但是通常我们都会遇到既有英文,又有汉字的情况.而汉字是占用2个字节的,如果用String.substring(start, end)截取字符串的话,会发现汉字截取后比英文截取后个数虽然相同,但是长度还是长出去不少(具体要视字符个数来决定).繁峙县粮食局 下面是一个实现这个功能的函数: <script language="java

#002#人人笔试题 截取html字符串

C实现 截取html 设定是html字符串里只有<p>标签,且闭合 输入:"abc<p class='c1'>defg</p>hijk<p style='width=100px;'>lmn</p>" 截取3个字符 输出:abc 截取4个字符 输出abc<p class='c1'>d</p> 1 #include<stdio.h> 2 #include<stdlib.h> 3 #i

截取开始字符串 结束字符串的中间字符串并返回

/// <summary> /// 指定开始字符串和结束字符串,截取中间的字符 /// </summary> /// <param name="str">要截取的字符串</param> /// <param name="s">开始字符串</param> /// <param name="e">结束字符串</param> /// <returns&

在一个字符串中截取指定字符串,域名截取,尝试截取不同网址的域名?

/** * 在一个字符串中截取指定字符串,域名截取,尝试截取不同网址的域名? *比如www.163.com,www.sohu.com.cn * 字符串截取就需要用subString() * 索引的位置,这里需要找第一个"."作为每次域名的开始索引,然后找下一个("."+1)作为结束位置 * 第一个点好找,indexOf搞定,第二点,用indexOf(".",之前的"."+1)找到 */ public class StringD

PHP截取中文字符串方法

方法一: /** * 截取utf8字符串 * @param string $str 字符串 * @param int $from 起始位 * @param int $len 结束们 * @return string */ public static function utf8Substr($str, $from, $len) { return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,' . $from . '}' . '