簡單解釋一些程式碼:
第一個 ~(]+?>)~si
這個正規是符合中的內容。簡單說是所有的。
第二個 ~]*?/>~si
這個正規是符合中的內容。是單一閉合標籤如
第三個~([a-z0-9]+)[^/>]*?>~si
這個正規是符合中的內容。也就是結束標籤 如
第四個 ~]*?>~si
符合<......>中的內容。這和第一個是不一樣的,這一個是真正的html標籤,因為html標籤只有數字和字母,如:
第五個~ ~si
不用解釋了,HTMl的註解
剩下的可以看原始碼了,php原始碼附件:
複製程式碼 程式碼如下:
/**
* 取HTML,並自動補全閉合
*
* param $html
*
* param $length
*
* param $end
*/
function sub?php
/**
* 取中文字串
*
* param $string 字串
*
* param $start 起始位
*
* param $length 長度*串
*/
function subHsubHt($html, $length=50) {
$result = '';
$tagStack = array();
$len = 0;
$contents = preg_split("~(]+?>)~si", $contents = preg_split("~(]+?>)~si", $contents = preg_split("~(]+?>)~si", $contents = preg_split("~(]+?>)~si", $contents = preg_split("~(]+?>)~si", $contents = preg_split("~(]+?>)~si", $1 html, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
foreach($contents as $tag) {
if (trim($tag) == "") continue;
if (preg_match($tag) == "") continue;
if (preg_match."]*?/>~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("~]*?>~si", $tag, $match)) {
array_push($tagStack, $match[1]);
$result .= $tag;
} else if (preg_match("~~si", $tag)) {
$result .= $tag;
} else {
if ($len + mstrlen($tag) $result .= $tag;
$len += mstrlen($tag);
} else
$len += mstrlen($tag);
}
$str = msubstr($tag, 0, $length - $len + 1);
$result .= $str;
break;
}
}
} while (!empty($$StackStack)) {resulttag .= '' . array_pop($tagStack) . '>';
}
return $result;
}
/**
* 得字串的長度,包括中英文。
*/
function msubstr($string, $start, $dot&*/
function msubstr($string, $start, $dot = '', $charset = 'UTF-8') {
$string = str_replace(array('&', '"', '', ' '), array('&', '" ', '', ' '), $string);
if (strlen($string) return $string;
}
if (strtolower($charset) == ' utf-8') {
$n = $tn = $noc = 0;
while ($n $t = ord($string[$n]);
if ($t == 9 || $t == 10 || (32 $tn = 1;
$n++;
} elseif (194 $tn = 2;
$n += 2;
} elseif (224 }$tn = 3;
$n += 31. (240 $tn = 4;
$n += 4;
} elseif (248 $tn = 5;
$n += 5;
} elseif ($t == 252 || $t == 253) {
$tn = 6;
$n += 6;
} noc++;
if ($noc >= $length) {
break;
}
}
if ($noc > $length) {
$n -= $tn; , $n);
} else {
for($i = 0; $i $strcut .= ord($string[$i]) > 127 ? $string[$i] . $string[++$i] : $string[$i];
}
}
return $strcut . $dot;
}
/**&*/
function mstrlen($str. '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]);
}
回傳$長度;
}
$str = "
x1s測試 |
124"; echo subHtml($str); ? |