⑴ php截取字元串之截取utf8或gbk編碼的中英文字元串示例
php中自帶strlen是返回的位元組數,對於utf8編碼的中文返回時3個,不滿足需求,下面給大家提供一個方法來完成這樣的功能
微博的發言有字數限制,其計數方式是,中文算2個,英文算1個,全形字元算2個,半形字元算1個。
php中自帶strlen是返回的位元組數,對於utf8編碼的中文返回時3個,不滿足需求。
mb_strlen
可以根據字元集計算長度,比如utf8的中文計數為1,但這不符合微博字數限制需求,中文必須計算為2才可以。
google了下,找到一個discuz中截取各種編碼字元的類,改造了下,已經測試通過.其中參數$charset
只支持gbk與utf-8。
代碼如下:
$a
=
"s@@你好";
var_mp(strlen_weibo($a,'utf-8'));
結果輸出為8,其中字母s計數為1,全形@計數為2,半形@計數為1,兩個中文計數為4。源碼如下:
代碼如下:
function
strlen_weibo($string,
$charset='utf-8')
{
$n
=
$count
=
0;
$length
=
strlen($string);
if
(strtolower($charset)
==
'utf-8')
{
while
($n
<
$length)
{
$currentByte
=
ord($string[$n]);
if
($currentByte
==
9
||
$currentByte
==
10
||
(32
<=
$currentByte
&&
$currentByte
<=
126))
{
$n++;
$count++;
}
elseif
(194
<=
$currentByte
&&
$currentByte
<=
223)
{
$n
+=
2;
$count
+=
2;
}
elseif
(224
<=
$currentByte
&&
$currentByte
<=
239)
{
$n
+=
3;
$count
+=
2;
}
elseif
(240
<=
$currentByte
&&
$currentByte
<=
247)
{
$n
+=
4;
$count
+=
2;
}
elseif
(248
<=
$currentByte
&&
$currentByte
<=
251)
{
$n
+=
5;
$count
+=
2;
}
elseif
($currentByte
==
252
||
$currentByte
==
253)
{
$n
+=
6;
$count
+=
2;
}
else
{
$n++;
$count++;
}
if
($count
>=
$length)
{
break;
}
}
return
$count;
}
else
{
for
($i
=
0;
$i
<
$length;
$i++)
{
if
(ord($string[$i])
>
127)
{
$i++;
$count++;
}
$count++;
}
return
$count;
}
}
⑵ php中解決中文和英文截取編碼問題。
我一直用這個
function CutStr($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<$strlen; $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 $tmpstr;
}
}
⑶ php 截取utf-8格式的字元串實例代碼
php
截取utf-8格式的字元串
php中,我們經常需要截取字元串。英文字元佔用一個位元組,中文字元佔用兩個位元組,但中文字元佔用兩個位元組是相對於GBK編碼而言但是在時下國際流行的UTF8編碼中,一個中文字元佔用3個位元組。本文章向大家介紹一個php
截取utf-8格式字元串的函數。
舉例說明:
function
truncate_utf8_string($string,
$length,
$etc
=
'...')
{
$result
=
'';
$string
=
html_entity_decode
(
trim
(
strip_tags
(
$string
)
),
ENT_QUOTES,
'UTF-8'
);
$strlen
=
strlen
(
$string
);
for($i
=
0;
(($i
<
$strlen)
&&
($length
>
0));
$i
++)
{
if
($number
=
strpos
(
str_pad
(
decbin
(
ord
(
substr
(
$string,
$i,
1
)
)
),
8,
'0',
STR_PAD_LEFT
),
'0'
))
{
if
($length
<
1.0)
{
break;
}
$result
.=
substr
(
$string,
$i,
$number
);
$length
-=
1.0;
$i
+=
$number
-
1;
}
else
{
$result
.=
substr
(
$string,
$i,
1
);
$length
-=
0.5;
}
}
$result
=
htmlspecialchars
(
$result,
ENT_QUOTES,
'UTF-8'
);
if
($i
<
$strlen)
{
$result
.=
$etc;
}
return
$result;
}
如果需要截取utf-8格式的字元串,直接調用這個函數即可。
<?php
$str="如果需要截取utf-8格式的字元串,直接調用這個函數即可。";
echo
truncate_utf8_string($str,10);//輸出結果:如果需要截取utf-8格...
?>
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
⑷ PHP如何獲取中文字元串長度 utf8
PHP對中文字元串的處理一直困擾於剛剛接觸PHP開發的新手程序員。下面簡要的剖析一下PHP對中文字元串長度的處理:
PHP自帶的函數如strlen()、mb_strlen()都是通過計算字元串所佔位元組數來統計字元串長度的,一個英文字元佔1位元組。例:
$enStr = 『Hello,China!』;
echo strlen($enStr); // 輸出:12
而中文則不然,做中文網站一般會選擇兩種編碼:gbk/gb2312或是utf-8。utf-8能兼容更多的字元,所以受到很多站長的喜愛。gbk與utf-8對中文的編碼不同,導致中文在gbk與utf-8編碼下所佔位元組也有差異。
gbk編碼下每個中文字元所佔位元組為2,例:
$zhStr = 『您好,中國!』;
echo strlen($zhStr); // 輸出:12
utf-8編碼下每個中文字元所佔位元組為3,例:
$zhStr = 『您好,中國!』;
echo strlen($zhStr); // 輸出:18
那麼如何計算這組中文字元串的長度呢?有人可能會說gbk下獲取中文字元串長度除以2,utf-8編碼下除以3不就行了嗎?但是您要考慮字元串並不老實,99%的情況會以中英混合的情況出現。
這是WordPress中的一段代碼,主要思想就是先用正則將字元串分解為個體單元,然後再計算單元的個數即字元串的長度,代碼如下(只能處理utf-8編碼下的字元串):
$zhStr = 『您好,中國!』;
$str = 『Hello,中國!』;
// 計算中文字元串長度
function utf8_strlen($string = null) {
// 將字元串分解為單元
preg_match_all(「/./us」, $string, $match);
// 返回單元個數
return count($match[0]);
}
echo utf8_strlen($zhStr); // 輸出:6
echo utf8_strlen($str); // 輸出:9
⑸ PHP里截取替換utf-8的網頁里的中文文字時,為什麼替換不了
如果你的PHP文件是UTF-8就應該正常,如果不是就需要iconv進行轉換,例如PHP文件是GBK編碼的時侯,代碼應該這樣寫:
$pat=iconv('GBK','UTF-8',"/口碑網([\s\S]*?)購站之一/");
$HTML=preg_replace($pat,"",$HTML);
⑹ PHP截取UTF8字元串如何應用
這個不是判斷語句--!
直接輸出,或賦值給變數
<?php
$str = '原始字元串數據'
$str2 = subString2($str,$start,$length);
echo $str2;
?>
$str 是你要截取的字元串
$start 是開始位置,一般為0
$length 是截取長度
⑺ php 中文字元串截取問題
preg_split()函數的意思。(意思為通過一個正則表達式分隔給定字元串)
array_splice() 函數與 array_slice() 函數類似,選擇數組中的一系列元素,但不返回,而是刪除它們並用其它值代替。
join() 方法用於把數組中的所有元素放入一個字元串。
<?php
$str = 'hypertext language programming';
$chars = preg_split('/ /', $str, -1, PREG_SPLIT_OFFSET_CAPTURE);
print_r($chars);
?>
會輸出
Array(
[0] => Array (
[0] => hypertext
[1] => 0
)
[1] => Array (
[0] => language
[1] => 10
)
[2] => Array (
[0] => programming
[1] => 19
)
)
⑻ php 截取UTF-8中文字元串問題
substr()函數可以 分割文字,但要分割的文字如果包括中文字元往往會遇到問題,這時可以用mb_substr()/mb_strcut這個函數,mb_substr() /mb_strcut的用法與substr()相似,只是在mb_substr()/mb_strcut最後要加入多一個參數,以設定字元串的編碼,但是 一般的伺服器都沒打開php_mbstring.dll,需要在php.ini在把php_mbstring.dll打開。
mb_substr是按字來切分字元,而mb_strcut是按位元組來切分字元,但是都不會產生半個字元的現象……
所以,把$str=substr($text,0,$k);替換為 $str=mb_substr($text,0,$k,'UTF-8');就ok了
⑼ PHP 截取UTF8字元串亂碼 --在線急等
/**********************************
* 截取字元串(UTF-8)
*
* @param string $str 原始字元串
* @param $position 開始截取位置
* @param $length 需要截取的偏移量
* @return string 截取的字元串
* $type=1 等於1時末尾加'...'不然不加
*********************************/
function utfSubstr($str, $position, $length,$type=1){
$startPos = strlen($str);
$startByte = 0;
$endPos = strlen($str);
$count = 0;
for($i=0; $i<strlen($str); $i++){
if($count>=$position && $startPos>$i){
$startPos = $i;
$startByte = $count;
}
if(($count-$startByte) >= $length) {
$endPos = $i;
break;
}
$value = ord($str[$i]);
if($value > 127){
$count++;
if($value>=192 && $value<=223) $i++;
elseif($value>=224 && $value<=239) $i = $i + 2;
elseif($value>=240 && $value<=247) $i = $i + 3;
else return self::raiseError("\"$str\" Not a UTF-8 compatible string", 0, __CLASS__, __METHOD__, __FILE__, __LINE__);
}
$count++;
}
if($type==1 && ($endPos-6)>$length){
return substr($str, $startPos, $endPos-$startPos)."...";
}else{
return substr($str, $startPos, $endPos-$startPos);
}
}
⑽ PHP 如何截取標題長度 (utf-8編碼)
你可以查詢出完整標題,然後用 CSS 的 overflow指定超出部分不顯示,在標題中含有中英、數字混合的情況,很難做到字元串排版的寬度一致。
還有最壞的情況,用截斷的方法,把實際完整的標題斷開,破壞了原義,對SEO是無比的傷害。
用css控制顯示長度才是最好的做法。