很多时候我们需要截取一段摘要,可能摘要中有样式,而且需要保留样式,那么在截取以后,很可能会有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/