PHP实现HTML字符串截取与自动补全标签
100 浏览量
更新于2024-08-28
收藏 54KB PDF 举报
本文主要介绍了如何在PHP中截取HTML字符串的同时自动补全未闭合的HTML标签。在处理HTML内容时,有时需要截取一部分显示,但直接使用strip_tags等函数会丢失HTML结构,影响可读性。文章提供了一个自定义函数subHtml()来解决这个问题。
在PHP开发中,我们可能遇到需要截取HTML字符串的情况,但单纯的截取可能会导致HTML标签不完整,影响页面的正确渲染。为了保持HTML结构的完整性,我们可以使用一个特定的函数来实现这一目标。以下是一个名为`subHtml()`的函数示例:
```php
function subHtml($html, $length, $end = '...') {
$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;
}
// 处理结束标签
elseif (preg_match('~</([a-z0-9]+)[^/>]*?>~si', $tag, $match)) {
if ($tagStack[count($tagStack) - 1] == $match[1]) {
array_pop($tagStack);
$result .= $tag;
}
}
// 处理开始标签
elseif (preg_match('~<([a-z0-9]+)[^/>]*?>~si', $tag, $match)) {
array_push($tagStack, $match[1]);
$result .= $tag;
}
// 保留注释
elseif (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 . $end;
}
```
该函数的工作原理是通过正则表达式将输入的HTML字符串分割成标签和内容两部分,然后遍历这些部分,对开始标签、结束标签和内容进行逐一处理。当截取长度达到指定值时,停止添加新的字符,并确保所有已打开的标签在返回结果中得到闭合。
这个函数的关键在于维护一个`$tagStack`数组,用于跟踪未闭合的开始标签。当遇到结束标签时,检查栈顶元素是否匹配,如果匹配则弹出栈顶元素;当遇到开始标签时,将其推入栈中。在截取完成后,若栈中仍有未闭合的开始标签,则依次补全对应的结束标签。
`subHtml()`函数的参数包括:
1. `$html`:需要截取的HTML字符串。
2. `$length`:截取的长度限制。
3. `$end`:超出长度后追加的省略号,默认为'...'。
通过这个函数,我们可以在保持HTML结构完整性的前提下,有效地截取和显示HTML内容。
148 浏览量
158 浏览量
143 浏览量
313 浏览量
2020-10-25 上传
493 浏览量
123 浏览量
108 浏览量
2020-10-27 上传
weixin_38722184
- 粉丝: 5
- 资源: 899
最新资源
- React性的
- Distributed-Blog-System:分布式博客系统实现
- CloseMe-crx插件
- 欧式建筑立面图纸
- 北理工自控(控制理论基础)实验报告
- yolov7升级版切图识别
- 作业-1 --- IT202:这是我的第一个网站
- hit-and-run:竞争性编程的便捷工具
- Pytorch-Vanilla-GAN:适用于MNIST,FashionMNIST和USPS数据集的Vanilla-GAN的Pytorch实现
- SNKit:iOS开发常用功能封装(Swift 5.0)
- 创意条形图-手机应用下载排行榜excel模板下载
- 项目36
- 通过混沌序列置乱水印.7z
- reactive-system-design
- getwdsdata.m:从 EPANET 输入文件中获取配水系统数据-matlab开发
- 100多套html模块+包含企业模板和后台模板(适合初级学习)