截取字符串 -- html标签闭合问题

很多时候我们需要截取一段摘要,可能摘要中有样式,而且需要保留样式,那么在截取以后,很可能会有html标签不完整或者没有配对等问题。

除了在截取时候跳过html标签不算字数,也可以在截取以后再遍历补全相关标签。


这里先给出 补全标签的php代码。

方案1:

【可以处理大部分情况,如果有更好代码或建议,欢迎交流】

代码原著:http://milianw.de/code-snippets/close-html-tags


<?php 
// Little modified for closing all the opened tags
// Like incase if we have “ < i > < i > rr < b > rrr < i > dddd < / i > < i > dddddd < / i > < i > ssss”
// Output would be : < i > < i > rr < b > rrr < i > dddd < / i > < i > dddddd < / i > < i > ssss < / i > < / i > < / b > < / i >
/**
 * closetags
 * used to close html tags incase not closed properly
 * 
 * @param string $html - html string
 * @access public 
 */
function closetags($html) {
$arr_single_tags = array('meta', 'img', 'br', 'link', 'area');
preg_match_all('#<([a-z]+)(?: .*)?(?<![/|/ ])\s*>#iU', $html, $result);
$openedtags = $result[1];
preg_match_all('#</([a-z]+)>#iU', $html, $result);
$closedtags = $result[1];
$len_opened = count($openedtags);
if (count($closedtags) == $len_opened) {
return $html;

$openedtags = array_reverse($openedtags); 
// re arrange open tags and closed tags for count
$aOpenedtagsCnt = Array();
$aClosedtagsCnt = Array();
if (is_array($openedtags)) {
foreach($openedtags as $iK => $sTag) {
if (!isset($aOpenedtagsCnt[$sTag])) {
$aOpenedtagsCnt[$sTag] = 1;
} else {
$aOpenedtagsCnt[$sTag]++;



if (is_array($closedtags)) {
foreach($closedtags as $iK => $sTag) {
if (!isset($aClosedtagsCnt[$sTag])) {
$aClosedtagsCnt[$sTag] = 1;
} else {
$aClosedtagsCnt[$sTag]++;



for ($i = 0; $i < $len_opened; $i++) {
if (!in_array($openedtags[$i], $arr_single_tags)) {
if ($aOpenedtagsCnt[$openedtags[$i]] != $aClosedtagsCnt[$openedtags[$i]]) {
$html .= '</' . $openedtags[$i] . '>';
if (!isset($aClosedtagsCnt[$openedtags[$i]])) {
$aClosedtagsCnt[$openedtags[$i]] = 1;
} else {
$aClosedtagsCnt[$openedtags[$i]]++;




return $html;



?>


方案2:

建议看看http://www.barattalo.it/html-fixer/


你可能感兴趣的:(截取字符串 -- html标签闭合问题)