侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

php对包含html标签的字符串进行截取的函数分享

php  /  管理员 发布于 7年前   316

这个方法的作用是:php截取含有html标签的字符串,如果标签未闭合就闭合标签,防止未闭合的标签破坏原网页布局。截取完之后将多余的内容替换为...或者其他任意字符,支持锚点指定替换到指定位置。

/** ============================== 截取含有 html标签的字符串 =========================* @param (string) $str   待截取字符串* @param (int)  $lenth  截取长度* @param (string) $repalce 超出的内容用$repalce替换之(该参数可以为带有html标签的字符串)* @param (string) $anchor 截取锚点,如果截取过程中遇到这个标记锚点就截至该锚点处* @return (string) $result 返回值* @demo  $res = cut_html_str($str, 256, '...'); //截取256个长度,其余部分用'...'替换* -------------------------------------------------------------------------------* $ Author: Wang Jian.|Email: [email protected]|Date: 2014/03/16* ===============================================================================*/ function cut_html_str($str, $lenth, $replace='', $anchor=''){ $_lenth = mb_strlen($str, "utf-8");// 统计字符串长度(中、英文都算一个字符)if($_lenth <= $lenth){return $str;// 传入的字符串长度小于截取长度,原样返回}$strlen_var = strlen($str); // 统计字符串长度(UTF8编码下-中文算3个字符,英文算一个字符)if(strpos($str, '<') === false){ return mb_substr($str, 0, $lenth);// 不包含 html 标签 ,直接截取} if($e = strpos($str, $anchor)){ return mb_substr($str, 0, $e);// 包含截断标志,优先} $html_tag = 0; // html 代码标记 $result = ''; // 摘要字符串$html_array = array('left' => array(), 'right' => array()); //记录截取后字符串内出现的 html 标签,开始=>left,结束=>right/** 如字符串为:

a

,假设p未闭合,数组则为:array('left'=>array('h3','p','b'), 'right'=>'b','h3');* 仅补全 html 标签,'){ $html_array_str = trim($html_array_str); //去除首尾空格,如
< img src="https:/article/" / > 等可能出现首尾空格if(substr($html_array_str, -1) != '/'){ //判断最后一个字符是否为 /,若是,则标签已闭合,不记录// 判断第一个字符是否 /,若是,则放在 right 单元 $f = substr($html_array_str, 0, 1); if($f == '/'){ $html_array['right'][] = str_replace('/', '', $html_array_str); // 去掉 '/' }else if($f != '?'){ // 若是?,则为 PHP 代码,跳过// 若有半角空格,以空格分割,第一个单元为 html 标签。如:

if(strpos($html_array_str, ' ') !== false){ // 分割成2个单元,可能有多个空格,如:

$html_array['left'][] = strtolower(current(explode(' ', $html_array_str, 2))); }else{ //若没有空格,整个字符串为 html 标签,如:

等,统一转换为小写$html_array['left'][] = strtolower($html_array_str); } } } $html_array_str = ''; // 字符串重置$html_tag = 0; }else{ $html_array_str .= $current_var; //将< >之间的字符组成一个字符串,用于提取 html 标签} }else{ --$lenth; // 非 html 代码才记数} $ord_var_c = ord($str{$i}); switch (true) { case (($ord_var_c & 0xE0) == 0xC0): // 2 字节 $result .= substr($str, $i, 2); $i += 1; break; case (($ord_var_c & 0xF0) == 0xE0): // 3 字节$result .= substr($str, $i, 3); $i += 2; break; case (($ord_var_c & 0xF8) == 0xF0): // 4 字节$result .= substr($str, $i, 4); $i += 3; break; case (($ord_var_c & 0xFC) == 0xF8): // 5 字节 $result .= substr($str, $i, 5); $i += 4; break; case (($ord_var_c & 0xFE) == 0xFC): // 6 字节$result .= substr($str, $i, 6); $i += 5; break; default: // 1 字节 $result .= $current_var; } } if($html_array['left']){ //比对左右 html 标签,不足则补全$html_array['left'] = array_reverse($html_array['left']); //翻转left数组,补充的顺序应与 html 出现的顺序相反foreach($html_array['left'] as $index => $tag){ $key = array_search($tag, $html_array['right']); // 判断该标签是否出现在 right 中if($key !== false){ // 出现,从 right 中删除该单元unset($html_array['right'][$key]); }else{ // 没有出现,需要补全 $result .= ''; } } } return $result.$replace; }

您可能感兴趣的文章:

  • php实现HTML实体编号与非ASCII字符串相互转换类实例
  • PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
  • php截取html字符串及自动补全html标签的方法
  • php 判断字符串中是否包含html标签
  • 浅析php过滤html字符串,防止SQL注入的方法
  • 实例讲解php将字符串输出到HTML


  • 上一条:
    PHP中strlen()和mb_strlen()的区别浅析
    下一条:
    php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客