ホームページ >バックエンド開発 >PHPチュートリアル >php_PHP チュートリアルで中国語の文字列をインターセプトする方法

php_PHP チュートリアルで中国語の文字列をインターセプトする方法

WBOY
WBOYオリジナル
2016-07-13 10:44:351237ブラウズ

phpで文字列をインターセプトする最も簡単な方法は、substr()関数を使用することですが、substr関数は英語のみをインターセプトでき、それが中国語の場合は文字化けしないと友人が言いました。このメソッドは、中国語と英語の混合文字をインターセプトできません。

この関数は、gb2312 でエンコードされた中国語文字列をインターセプトするために使用されます:

コードは次のとおりです コードをコピー

// 説明: 中国語文字列をインターセプトします

関数 mysubstr($str, $start, $len) {
$tmpstr = ""; $strlen = $start + $len
; for($i = 0; $i <$strlen; $i++) {
If(ord(substr($str, $i, 1)) > 0xa0) {
$tmpstr .= substr($str, $i, 2); $i++; } 他
$tmpstr .= substr($str, $i, 1); }
$tmpstr を返す
}
?>



漢字インターセプト機能をUtf-8とgb2312でサポート

インターセプト utf-8 文字列関数

複数の言語をサポートするために、データベース内の文字列は UTF-8 エンコードとして保存される場合があります。Web サイトの開発中に、文字列の一部をインターセプトするために PHP を使用する必要がある場合があります。文字化けを避けるために、以下のUTF-8文字列インターセプト関数を記述します

UTF-8 の原則については、UTF-8 FAQ をご覧ください

UTF-8 でエンコードされた文字は 1 ~ 3 バイトで構成され、最初のバイトから特定の数を決定できます。 (理論的にはもっと長いかもしれませんが、ここでは 3 バイト以下であると仮定します)
最初のバイトが 224 より大きい場合、そのバイトとそれに続く 2 バイトは UTF-8 文字を形成します
最初のバイトが 192 より大きく 224 より小さい場合、そのバイトとその後の 1 バイトは UTF-8 文字を形成します
それ以外の場合、最初のバイト自体は英語文字 (数字と少量の句読点を含む) です。

コードは次のとおりです コードをコピー


// 説明: Utf-8 および gb2312 でサポートされる漢字インターセプト機能

/*
Utf-8とgb2312で漢字インターセプト機能をサポート
Cut_str(文字列、カット長、開始長、エンコーディング); エンコードのデフォルトは utf-8 です
開始長のデフォルトは 0 です
*/

関数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)); }
それ以外
{
$start = $start*2; $sublen = $sublen*2; $strlen = strlen($string); $tmpstr = '';
for($i=0; $i                                                                    If($i>=$start && $i                                                                   If(ord(substr($string, $i, 1))>129)
                                                                       $tmpstr.= substr($string, $i, 2);                                                                                       その他
                                                                       $tmpstr.= substr($string, $i, 1);                                                                                                                                                                      If(ord(substr($string, $i, 1))>129) $i++; }
If(strlen($tmpstr) }

$str = "abcd がインターセプトする必要がある文字列"; echo Cut_str($str, 8, 0, 'gb2312'); ?>



注:

コードは次のとおりです コードをコピー

関数 utf8Substr($str, $from, $len)
{
preg_replace('#^(?:[x00-x7F]|[xC0-xFF][x80-xBF]+){0,'.$from.'}' を返します。
'((?:[x00-x7F]|[xC0-xFF][x80-xBF]+){0,'.$len.'}).*#s',
‘$1’,$str); }

uft8 文字列を個別にインターセプトできます。

プログラムの説明:

1. len パラメータは、見た目を良くするために、漢字 2 文字に相当します。

2. マジックパラメータが false に設定されている場合、中国語と英語は同等に扱われ、絶対文字数が取得されます

3. htmlspecialchars() でエンコードされた文字列に特に適しています

4. GB2312 のエンティティ文字モード (𖰰) を正しく処理できます

プログラムコード:

コードは次のとおりです関数 FSubstr($title,$start,$len="",$magic=true)
コードをコピー
{

/**
* スマートピッグによる提供
* メールアドレス:d.einstein@263.net
*/

$長さ = 0; if($len == "") $len = strlen($title);

//開始位置が間違っていると判断します
if($start > 0)

{

$cnum = 0; for($i=0;$i {
if(ord(substr($title,$i,1)) >= 128) $cnum ++
}
if($cnum%2 != 0) $start--;

設定解除($cnum)
}

if(strlen($title)<=$len) return substr($title,$start,$len);


$アレン = 0; $ブレン = 0;

$realnum = 0;

for($i=$start;$i {

$ctype = 0; $cstep = 0; $cur = substr($title,$i,1); if($cur == "&")

{

if(substr($title,$i,4) == "<")

{
$cstep = 4; $長さ += 4; $i += 3; $realnum++
if($magic)
{
$アレン++
}
}
else if(substr($title,$i,4) == ">")
{
$cstep = 4; $長さ += 4; $i += 3; $realnum++
if($magic)
{
$アレン++
}
}
else if(substr($title,$i,5) == "&")
{
$cstep = 5; $長さ += 5; $i += 4; $realnum++
if($magic)
{
$アレン++
}
}
else if(substr($title,$i,6) == """)
{
$cstep = 6; $長さ += 6; $i +=
; $realnum++
if($magic)
{
$アレン++
}
}
else if(substr($title,$i,6) == "'")
{
$cstep = 6; $長さ += 6; $i +=
; $realnum++
if($magic)
{
$アレン++
}
}
else if(preg_match("/(d+);/i",substr($title,$i,8),$match))
{
$cstep = strlen($match[0]); $length += strlen($match[0]); $i += strlen($match[0])-1; $realnum++
if($magic)
{
$ブレン++
$ctype = 1; }
}
}その他{
if(ord($cur)>=128)
{
$cstep = 2; $長さ += 2; $i += 1; $realnum++
if($magic)
{
$ブレン++
$ctype = 1; }
}その他{
$cstep = 1; $長さ +=1
$realnum++
if($magic)
{
$アレン++
}
}
}

if($magic)
{
if(($blen*2+$alen) == ($len*2)) ブレーク; if(($blen*2+$alen) == ($len*2+1))
{
if($ctype == 1)
{
$length -= $cstep
休憩
}その他{
休憩
}
}
}その他{
if($realnum == $len) ブレーク
}
}

設定解除($cur); 設定を解除($alen)
設定を解除($blen); 設定を解除($realnum)
設定を解除($ctype)
unset($cstep);

substr($title,$start,$length)を返します
}




www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/633089.html技術記事 phpで文字列をインターセプトする最も簡単な方法はsubstr()関数を使用することですが、substr関数は英語のみをインターセプトできるので、それが使用できると友人が言いました...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。