/****首先是CSDN论坛PHP斑竹xuzuning(唠叨)老大的,支持gb2312,gbk,big三种编码。 |
以下是代码:***/ |
$len = 19; |
$text = "怎么将新闻的很长的标题只显示前面一些字,后面用.....来代替?" ; |
echo strlen ( $text )<= $len ? $text : ( substr ( $text ,0, $len ). chr (0). "...." ); |
/****chr(0)不是null |
null是什么都没有,而chr(0)的值是0。表示成16进制是0x00,表示成二进制是00000000 |
虽然chr(0)不会显示出什么,但是他是一个字符。 |
当汉字被截断时,根据编码规则他总是要把后边的其他字符拉过来一起作为汉字解释,这就是出现乱码的原因。而值为0x81到0xff与0x00组合始终都显示为“空” |
根据这一特点,在substr的结果后面补上一个chr(0),就可以防止出现乱码了 |
注: |
编码 第一字节 第二字节 |
gb2312 0xa1-0xf7 0xa1-0xfe |
gbk 0x81-0xfe 0x81-0xfe 0x40-0x7e |
big5 0xa1-0xf7 0x81-0xfe 0x40-0x7e |
其次这个是网上搜索的,支持utf-8编码,原作者不详: |
*****/ |
function subString_UTF8( $str , $start , $lenth ) |
{ |
$len = strlen ( $str ); |
$r = array (); |
$n = 0; |
$m = 0; |
for ( $i = 0; $i < $len ; $i ++) { |
$x = substr ( $str , $i , 1); |
$a = base_convert (ord( $x ), 10, 2); |
$a = substr ( '00000000' . $a , -8); |
if ( $n < $start ){ |
if ( substr ( $a , 0, 1) == 0) { |
} elseif ( substr ( $a , 0, 3) == 110) { |
$i += 1; |
} elseif ( substr ( $a , 0, 4) == 1110) { |
$i += 2; |
} |
$n ++; |
} else { |
if ( substr ( $a , 0, 1) == 0) { |
$r [ ] = substr ( $str , $i , 1); |
} elseif ( substr ( $a , 0, 3) == 110) { |
$r [ ] = substr ( $str , $i , 2); |
$i += 1; |
} elseif ( substr ( $a , 0, 4) == 1110) { |
$r [ ] = substr ( $str , $i , 3); |
$i += 2; |
} else { |
$r [ ] = '' ; |
} |
if (++ $m >= $lenth ){ |
break ; |
} |
} |
} |
return $r ; |
} // End subString_UTF8; |
} // End String |
#由于此函数返回的是一个数组,因此要配合join函数来显示字符串: |
#join( '' ,subString_UTF8( $str , $start , $lenth )); |
#在页面显示的时候还可以在此语句后面连一个 "..." |
<php |
function get_substr( $string , $start = '0' , $length = '' ) |
{ |
$start = (int) $start ; |
$length = (int) $length ; |
$i = 0; |
if (! $string ) |
{ |
return ; |
} |
if ( $start >=0) |
{ |
while ( $i < $start ) |
{ |
if (ord( $string [ $i ])>127) |
{ |
$i = $i +2; |
} |
else |
{ |
$i ++; |
} |
} |
$start = $i ; |
if ( $length == '' ) |
{ |
return substr ( $string , $start ); |
} |
elseif ( $length >0) |
{ |
$end = $start + $length ; |
while ( $i < $end ) |
{ |
if (ord( $string [ $i ])>127) |
{ |
$i = $i +2; |
} |
else |
{ |
$i ++; |
} |
} |
if ( $end != $i -1) |
{ |
$end = $i ; |
} |
else |
{ |
$end --; |
} |
$length = $end - $start ; |
return substr ( $string , $start , $length ); |
} |
elseif ( $length ==0) |
{ |
return ; |
} |
else |
{ |
$length = strlen ( $string )- abs ( $length )- $start ; |
return get_substr( $string , $start , $length ); |
} |
} |
else |
{ |
$start = strlen ( $string )- abs ( $start ); |
return get_substr( $string , $start , $length ); |
} |
} |
?> |