Home  >  Article  >  Backend Development  >  PHP makes HTML tags automatically complete closing function codes

PHP makes HTML tags automatically complete closing function codes

高洛峰
高洛峰Original
2016-12-01 14:58:061505browse

Brief explanation of some codes:
The first ~(<[^>]+?>)~si
This regular expression matches the content in <…………>. Simply put, all .
The second ~<([a-z0-9]+)[^/>]*?/>~si
This regular expression matches the content in <……/>. It is a single closed tag such as

The third ~]*?>~si
This regular expression matches . That is, the end tag such as
The fourth~<([a-z0-9]+)[^/>]*?>~si
matches<......> ; the content in . This is different from the first one. This one is a real html tag, because html tags only have numbers and letters, such as:


The fifth one~~si
No need to explain, HTMl comments
The rest can be seen in the source code, php source code attachment:
Copy code The code is as follows:
/**
* Take HTML and automatically complete and close it
*
* param $html
*
* param $length
*
* param $end
*/
function subHtml($html, $length=50) {
$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;
} else if (preg_match("~< ;/([a-z0-9]+)[^/>]*?>~si", $tag, $match)) {
if ($tagStack[count($tagStack)-1] == $match[1]) {
array_pop($tagStack);
$result .= $tag;
}
} else if (preg_match("~<([a-z0-9]+)[^/> ]*?>~si", $tag, $match)) {
array_push($tagStack, $match[1]);
$result .= $tag;
} else if (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 .= '';
}
return $result;
}
/ **
* Get Chinese string
*
* param $string string
*
* param $start starting bit
*
* param $length length
*
* param $charset encoding
*
* param $dot additional word String
*/
function msubstr($string, $start, $length, $dot = '', $charset = 'UTF-8') {
$string = str_replace(array('&', '" ', '<', '>', ' '), array('&', '"', '<', '>', ' '), $string);
if (strlen($ string) <= $length) {
return $string;
}
if (strtolower($charset) == 'utf-8') {
$n = $tn = $noc = 0;
while ($n < strlen($string)) {
$t = ord($string[$n]);
if ($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {
$tn = 1;
$n++;
} elseif (194 <= $t && $t <= 223) {
$tn = 2;
$n += 2;
} elseif (224 <= $t && $t <= 239) {
$tn = 3;
$n += 3;
} elseif (240 <= $t && $t <= 247) {
$tn = 4;
$n += 4;
} elseif (248 <= $t && $t <= 251) {
$tn = 5;
$n += 5;
} elseif ($ t == 252 || $t == 253) {
$tn = 6;
$n += 6;
} else {
$n++;
}
$noc++;
if ($noc >= $length ) {
break;
}
}
if ($noc > $length) {
$n -= $tn;
}
$strcut = substr($string, 0, $n);
} else {
for($i = 0; $i < $length; $i++) {
$strcut .= ord($string[$i]) > 127 ? $string[$i] . $string[++$i ] : $string[$i];
}
}
return $strcut . $dot;
}
/**
* Get the length of the string, including Chinese and English.
*/
function mstrlen($str, $charset = 'UTF-8') {
if (function_exists('mb_substr')) {
$length = mb_strlen($str, $charset);
} elseif (function_exists('iconv_substr')) { 
$length = iconv_strlen($str, $charset); 
} else { 
preg_match_all("/[x01-x7f]|[xc2-xdf][x80-xbf]|xe0[xa0-xbf][x80-xbf]|[xe1-xef][x80-xbf][x80-xbf]|xf0[x90-xbf][x80-f][x80-xbf]|[xf1-xf7][x80-xbf][x80-xbf][x80-xbf]/", $text, $ar); 
$length = count($ar[0]); 

return $length; 

$str = "
x1s
测试124"; 
echo subHtml($str); 
?> 

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn