PHP实现HTML字符串截取与自动补全标签

1 下载量 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内容。