phpphp字符串截取函数字符串

php截取html字符串及自动补全html标签的方法
本文实例讲述了截取html字符串及自动补全html标签的方法。分享给大家供大家参考。具体分析如下:
这里总结一下关于利用php截取html字符串自动补全html标签,实际开发中会经常碰到,很多人直接先strip_tags过滤掉html标签,但是就只剩下纯文本了,可读性非常差,下面是一个函数,代码如下:
代码如下:/**
&* 截取HTML,并自动补全闭合
&* @param $html
&* @param $length
&* @param $end
function subHtml($html,$length) {
&$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)=="")&
&if(preg_match("~&([a-z0-9]+)[^/&]*?/&~si",$tag)){
&$result .= $
&}else if(preg_match("~&/([a-z0-9]+)[^/&]*?&~si",$tag,$match)){
&if($tagStack[count($tagStack)-1] == $match[1]){
&array_pop($tagStack);
&$result .= $
&}else if(preg_match("~&([a-z0-9]+)[^/&]*?&~si",$tag,$match)){
&array_push($tagStack,$match[1]);
&$result .= $
&}else if(preg_match("~&!--.*?--&~si",$tag)){
&$result .= $
&if($len + mstrlen($tag) & $length){
&$result .= $
&$len += mstrlen($tag);&
&$str = msubstr($tag,0,$length-$len+1);
&$result .= $
&while(!emptyempty($tagStack)){
&$result .= '&/'.array_pop($tagStack).'&';
&return& $
&* 截取中文字符串
&* @param $string 字符串
&* @param $start 起始位
&* @param $length 长度
&* @param $charset& 编码
&* @param $dot 附加字串
function msubstr($string, $start, $length,$dot='',$charset = 'UTF-8') {
&$string = str_replace(array('&', '&', '&', '&','&'), array('&', '"', '&', '&',' '), $string);
&if(strlen($string) &= $length) {
&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;
&if($noc &= $length) {
&if($noc & $length) {
&$strcut = substr($string, 0, $n);
&for($i = 0; $i & $ $i++) {
&$strcut .= ord($string[$i]) & 127 ? $string[$i].$string[++$i] : $string[$i];
&return $strcut.$
&* 取得字符串的长度,包括中英文。
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);
&preg_match_all("/[x01-x7f]|[xc2-xdf][x80-xbf]|xe0[xa0-xbf][x80-xbf]|[xe1-xef][x80-xbf][x80-xbf]|xf0[x90-xbf][x80-xbf][x80-xbf]|[xf1-xf7][x80-xbf][x80-xbf][x80-xbf]/", $text, $ar);&&
&$length=count($ar[0]);
实例,代码如下:
代码如下:* @param 要截取的HTML $str
* @param 截取的数量 $num
* @param 是否需要加上更多 $more
* @return 截取串
function phpos_chsubstr_ahtml($str,$num,$more=false)
&&& $leng=strlen($str);
&&&&& if($num&=$leng)
&&&&& return $
&&& $word=0;
&&& $i=0;&&&&&&&&&&&&&&&&&&&&&&& /** 字符串指针 **/
&&& $stag=array(array());&&&&&&& /** 存放开始HTML的标志 **/
&&& $etag=array(array());&&&&&&& /** 存放结束HTML的标志 **/
&&& $sp = 0;
&&& $ep = 0;
&&&&& while($word!=$num)
&&&&&&&&& if(ord($str[$i])&128)
&&&&&&&&& {
&&&&&&&&&&& //$re.=substr($str,$i,3);
&&&&&&&&&&& $i+=3;
&&&&&&&&&&& $word++;
&&&&&&&&& }
&&&&&&&&& else if ($str[$i]=='&')
&&&&&&&&& {
&&&&&&&&&&&&& if ($str[$i+1] == '!')
&&&&&&&&&&&&& {
&&&&&&&&&&&&&&& $i++;
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&& }
&&&&&&&&&&&&& if ($str[$i+1]=='/')&&&&
&&&&&&&&&&&&& {
&&&&&&&&&&&&&&& $ptag=&$
&&&&&&&&&&&&&&& $k=&$
&&&&&&&&&&&&&&& $i+=2;
&&&&&&&&&&&&& }
&&&&&&&&&&&&& else&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&& {
&&&&&&&&&&&&&&& $ptag=&$
&&&&&&&&&&&&&&& $i+=1;
&&&&&&&&&&&&&&& $k=&$
&&&&&&&&&&&&& }
&&&&&&&&&&&&& for(;$i&$$i++)&&&&&&&&
&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&& if ($str[$i] == ' ')
&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& $ptag[$k] = implode('',$ptag[$k]);
&&&&&&&&&&&&&&&&&&& $k++;
&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&& if ($str[$i] != '&')&
&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& $ptag[$k][]=$str[$i];
&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&& else&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& $ptag[$k] = implode('',$ptag[$k]);
&&&&&&&&&&&&&&&&&&& $k++;
&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&& }
&&&&&&&&&&& $i++;
&&&&&&&&&&&&&
&&&&&&&&& }
&&&&&&&&& else
&&&&&&&&& {
&&&&&&&&&&& //$re.=substr($str,$i,1);
&&&&&&&&&&& $word++;
&&&&&&&&&&& $i++;
&&&&&&&&& }
&&&&& foreach ($etag as $val)
&&&&&&& $key1=array_search($val,$stag);
&&&&&&&&& if ($key1 !== false)&&&&&&&&& unset($stag[$key]);
&&&&& foreach ($stag as $key =& $val)
&&&&&&&&& if (in_array($val,array('br','img'))) unset($stag[$key1]);
&&& array_reverse($stag);
&&& $ends = '&/'.implode('&&/',$stag).'&';
&&& $re = substr($str,0,$i).$
&&&&& if($more)&&& $re.='...';
&&&&& return $
PHP截取字符串,生成文章摘要,我们在写BLOG时经常需要显示文章前一部分,但是又怕不恰当截断破坏封闭标签以造成整个文档结构破坏,代码如下:
代码如下:function text_zhaiyao($text,$length){ //文章摘要生成函数& $test:内容 $length:摘要长度
&&& global $Briefing_L
&&& mb_regex_encoding("UTF-8");
&&& if(mb_strlen($text) &= $length ) return $
&&& $Foremost = mb_substr($text, 0, $length);
&&& $re = "&(/?)
&&& (P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|TABLE|TR|TD|TH|INPUT|SELECT|TEXTAREA|OBJECT|A|UL|OL|LI|
&&& BASE|META|LINK|HR|BR|PARAM|IMG|AREA|INPUT|SPAN)[^&]*(&?)";
&&& $Single = "/BASE|META|LINK|HR|BR|PARAM|IMG|AREA|INPUT|BR/i";
&&& $Stack = array(); $posStack = array();
&&& mb_ereg_search_init($Foremost, $re, 'i');
&&& while($pos = mb_ereg_search_pos()){
&&& $match = mb_ereg_search_getregs();
&&& /* [Child-matching Formulation]:
&&& $matche[1] : A "/" charactor indicating whether current "&...&" Friction is
&&& Closing Part
&&& $matche[2] : Element Name.
&&& $matche[3] : Right & of a "&...&" Friction
&&& if($match[1]==""){
&&& $Elem = $match[2];
&&& if(mb_eregi($Single, $Elem) && $match[3] !=""){
希望本文所述对大家的php程序设计有所帮助。
顶一下(0) 踩一下(0)
热门标签:新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
UID空间积分0 积分1769阅读权限30帖子精华可用积分1769 信誉积分142 专家积分0 在线时间223 小时注册时间最后登录
家境小康, 积分 1769, 距离下一级还需 231 积分
帖子主题精华可用积分1769 信誉积分142 专家积分0 在线时间223 小时注册时间最后登录
论坛徽章:0
php中如何截取中文字符串?
众所周知php原生函数substr是不支持截取中文字符串的。下面的代码提供了多种截取php中文字符串的方法。
1. 截取GB2312中文字符串&?php
& ?php
//截取中文字符串
function mysubstr($str, $start, $len) {
& & $tmpstr = &&;
& & $strlen = $start + $
& & for($i = 0; $i & $ $i++) {
& && &&&if(ord(substr($str, $i, 1)) & 0xa0) {
& && && && &$tmpstr .= substr($str, $i, 2);
& && && && &$i++;
& && &&&} else
& && && && &$tmpstr .= substr($str, $i, 1);
& & }
& & return $
}
?&复制代码2. 截取utf8编码的多字节字符串&?php
& ?php
//截取utf8字符串
function utf8Substr($str, $from, $len)
{
& & return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$from.'}'.
& && && && && && && &&&'((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$len.'}).*#s',
& && && && && && && &&&'$1',$str);
}
?&复制代码3. UTF-8、GB2312都支持的汉字截取函数&?php
& ?php
/*
Utf-8、gb2312都支持的汉字截取函数
cut_str(字符串, 截取长度, 开始长度, 编码);
编码默认为 utf-8
开始长度默认为 0
*/
function cut_str($string, $sublen, $start = 0, $code = 'UTF-8')
{
& & if($code == 'UTF-8')
& & {
& && &&&$pa = &/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/&;
& && &&&preg_match_all($pa, $string, $t_string);
& && &&&if(count($t_string[0]) - $start & $sublen) return join('', array_slice($t_string[0], $start, $sublen)).&...&;
& && &&&return join('', array_slice($t_string[0], $start, $sublen));
& & }
& & else
& & {
& && &&&$start = $start*2;
& && &&&$sublen = $sublen*2;
& && &&&$strlen = strlen($string);
& && &&&$tmpstr = '';
& && &&&for($i=0; $i& $ $i++)
& && &&&{
& && && && &if($i&=$start && $i& ($start+$sublen))
& && && && &{
& && && && && & if(ord(substr($string, $i, 1))&129)
& && && && && & {
& && && && && && &&&$tmpstr.= substr($string, $i, 2);
& && && && && & }
& && && && && & else
& && && && && & {
& && && && && && &&&$tmpstr.= substr($string, $i, 1);
& && && && && & }
& && && && &}
& && && && &if(ord(substr($string, $i, 1))&129) $i++;
& && &&&}
& && &&&if(strlen($tmpstr)& $strlen ) $tmpstr.= &...&;
& && &&&return $
& & }
}
$str = &abcd需要截取的字符串&;
echo cut_str($str, 8, 0, 'gb2312');
?&复制代码4. BugFree 的字符截取函数& ?php
/**
* @package& &&&BugFree
* @version& &&&$Id: FunctionsMain.inc.php,v 1.32
11:38:37 wwccss Exp $
* Return part of a string(Enhance the function substr())
* @author& && && && && && &Chunsheng Wang &&
* @param string&&$String&&the string to cut.
* @param int& &&&$Length&&the length of returned string.
* @param booble&&$Append&&whether append &...&: false|true
* @return string& && && &&&the cutted string.
*/
function sysSubStr($String,$Length,$Append = false)
{
& & if (strlen($String) & = $Length )
& & {
& && &&&return $S
& & }
& & else
& & {
& && &&&$I = 0;
& && &&&while ($I & $Length)
& && &&&{
& && && && &$StringTMP = substr($String,$I,1);
& && && && &if ( ord($StringTMP) &=224 )
& && && && &{
& && && && && & $StringTMP = substr($String,$I,3);
& && && && && & $I = $I + 3;
& && && && &}
& && && && &elseif( ord($StringTMP) &=192 )
& && && && &{
& && && && && & $StringTMP = substr($String,$I,2);
& && && && && & $I = $I + 2;
& && && && &}
& && && && &else
& && && && &{
& && && && && & $I = $I + 1;
& && && && &}
& && && && &$StringLast[] = $StringTMP;
& && &&&}
& && &&&$StringLast = implode(&&,$StringLast);
& && &&&if($Append)
& && &&&{
& && && && &$StringLast .= &...&;
& && &&&}
& && &&&return $StringL
& & }
}
$String = & 走在中国自动化测试的前沿&;
$Length = &18&;
$Append =
echo sysSubStr($String,$Length,$Append);
?&复制代码
总评分:&可用积分 + 30&
信誉积分 -30&
三七二十一
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
UID空间积分0 积分890阅读权限20帖子精华可用积分890 信誉积分114 专家积分530 在线时间1058 小时注册时间最后登录
丰衣足食, 积分 890, 距离下一级还需 110 积分
帖子主题精华可用积分890 信誉积分114 专家积分530 在线时间1058 小时注册时间最后登录
论坛徽章:0
总评分:&可用积分 + 1&
UID空间积分0 积分8910阅读权限90帖子精华可用积分8910 信誉积分646 专家积分15 在线时间415 小时注册时间最后登录
腰缠万贯, 积分 8910, 距离下一级还需 1090 积分
帖子主题精华可用积分8910 信誉积分646 专家积分15 在线时间415 小时注册时间最后登录
论坛徽章:0
用mb_string 啊
UID空间积分0 积分14阅读权限10帖子精华可用积分14 信誉积分100 专家积分0 在线时间1 小时注册时间最后登录
白手起家, 积分 14, 距离下一级还需 186 积分
帖子主题精华可用积分14 信誉积分100 专家积分0 在线时间1 小时注册时间最后登录
论坛徽章:0
非常全面,比直接用substr高级很多,php无损截取包括html标签的字符串 - 推酷
php无损截取包括html标签的字符串
这个标题实在是不知道怎么取,字符串截取很简单,但是像WP这样首页很多都是截取一部分文字或者使用摘要或更多标签的方式来显示部分文本..
很不幸的是很多人用的就是字符串截取,于是发现问题:
如果一段字符串,例如:
“Thanks for use &a href=”&&span class=”link”&&/span&wordpress&/a&”,
如果要截取前面15个字符串,那肯定没问题,如果截取的是20个字符串,那肯定就落在&a&标签里,
这么一来截取后再显示取来的内容就有问题,标签不完整,可能会影响样式..
于是搜索了下,果然有料,腾讯的面试题?:
围观了很久,试了几个贴出来的代码,都不行,人品问题?
索性还是自己写个,思路跟他们不一样:
* 字符串切割
* 功能:截取字符串(支持中文),如果字符串中包括html标签,截取的字符串则会保留完整的html标签
* 如果截取的字符串中包含不完整的html标签,则从字符串位置0开始截取到html标签前
* @param string $string
* @param unknown $length
* @param string $replace
* @return string
function wpgo_substrUtf8($string, $length, $replace = '…') {
// 先截取指定长度的字符串
if (strlen ( $string ) & $length) {
$str = substr ( $string, 0 );
$char = ord ( $string [$length - 1] );
if ($char &= 224 && $char &= 239) {
$str = substr ( $string, 0, $length - 1 );
$char = ord ( $string [$length - 2] );
if ($char &= 224 && $char &= 239) {
$str = substr ( $string, 0, $length - 2 );
$str = substr ( $string, 0, $length );
// 提取截取出来的字符串中出现的html开始和闭合标签的值和位置索引
$starts = $start_str = $ends = array ();
preg_match_all ( '/&\w+[^&]*&?/', $str, $starts, PREG_OFFSET_CAPTURE );
preg_match_all ( '/&\/\w+&/', $str, $ends, PREG_OFFSET_CAPTURE );
$cut_pos = 0;
$last_str = '';
if (! empty ( $starts [0] )) {
$starts = array_reverse ( $starts [0] );
if (! empty ( $ends [0] )) {
$ends = array_reverse ( $ends [0] );
// 根据开始标签和结束标签的字符串索引大小和值是否相等来获取可以截取的长度
foreach ( $starts as $sk =& $s ) {
if ($auto = strripos ( $s [0], '/&' )) {
if ($cut_pos & $auto) {
$cut_pos = $s [1];
$last_str = $s [0];
unset ( $starts [$sk] );
preg_match ( '/&(\w+).*&?/', $s [0], $start_str );
if (! empty ( $ends )) {
foreach ( $ends as $ek =& $e ) {
$end_str = trim ( $e [0], '&/&' );
if ($end_str == $start_str [1] && $e [1] & $s [1]) {
if ($cut_pos & $e [1]) {
$cut_pos = $e [1];
$last_str = $e [0];
unset ( $ends [$ek] );
$last_str = '';
$cut_pos = 0;
$last_str = '';
$cut_pos = $s [1];
if ($cut_pos == 0) {
$starts = array_pop ( $starts );
$cut_pos = $starts [1];
$last_str = '';
// 拼凑剩余的字符串,不包括html标签
$res_str = substr ( $str, 0, $cut_pos ) . $last_
$less_pos = substr ( $str, strlen ( $res_str ) );
$less_str = substr ( $less_pos, 0, strpos ( $less_pos, '&' ) );
$res_str .= $less_str == false ? $less_pos : $less_
return $res_str . $
有问题的话请指出...
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致PHP 中文字符串截取无乱码的方法以及php汉字截取函数_preg_split()_PHP教程_编程技术
您的位置: &
& PHP 中文字符串截取无乱码的方法以及php汉字截取函数_preg_split()
昨天,在写代码时我遇到了一个中文字符串截取的问题,原本是想直接用substr()来,但这个是在单字节符下用的,对于多字节编码的汉字或是其它语言字符中,这个函数可能就用不上了,而且会容易截出乱码来!
现在就把我的下工作记录和总结给大家分享一下:
问题产生及使用案例网站:天气预报15天查询(http://tqybw.net)
问题时间:
解决思路:把汉字按一个汉字在编码下按其在完整性正则分割成数组,再根据需要取截取长度;
1、实现方法函数
开启mbstring扩展,然后自定义函数:
header('content-Type:text/html:charset=utf-8');
function substr_chinese($str, $start, $length = null) {
return join(&&,
array_slice(
preg_split(&//u&, $str, -1, PREG_SPLIT_NO_EMPTY), $start, $length)
} (PS:^_^不错的php学习交流群:,验证:csl,谢谢!)
$str = &中国地图全图&;
echo substr_utf8($str, 0, 4);
//输出: 中国地图
2、主要函数功能说明preg_split:
对于初学者来说,大家对 说明 array preg_split ( string $pattern, string $subject [, int $limit [, int $flags]] )
返回一个数组,包含 subject 中沿着与 pattern 匹配的边界所分割的子串。
如果指定了 limit,则最多返回 limit 个子串,如果 limit 是 -1,则意味着没有限制,可以用来继续指定可选参数 flags。
flags 可以是下列标记的任意组合(用按位或运算符
PREG_SPLIT_NO_EMPTY
如果设定了本标记,则 preg_split() 只返回非空的成分。
PREG_SPLIT_DELIM_CAPTURE
如果设定了本标记,定界符模式中的括号表达式也会被捕获并返回。本标记添加于 PHP 4.0.5。
PREG_SPLIT_OFFSET_CAPTURE
如果设定了本标记,如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。注意这改变了返回的数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其在 subject 中的偏移量。本标记自 PHP 4.3.0 起可用。
如果不需要正则表达式的功能,可以选择使用更快(也更简单)的替代函数如 explode() 或 str_split()。
3、array_slice说明:
array_slice() 函数在数组中根据条件取出一段值,并返回。
$a=array(0=&&Dog&,1=&&Cat&,2=&&Horse&,3=&&Bird&);
print_r(array_slice($a,1,2));
输出:Array ( [0] =& Cat [1] =& Horse )
本文讲述了PHP 中文字符串截取无乱码方法,希望本文能给读者带来灵感,帮助读者解决疑问,感谢本文。
( 10:21:45)
( 10:21:43)
( 10:21:39)
( 10:21:35)
( 10:21:34)
( 10:21:32)
( 10:21:29)
( 09:05:22)
相关排行总榜

我要回帖

更多关于 php字符串截取函数 的文章

 

随机推荐