ホームページ  >  記事  >  バックエンド開発  >  PHP が文字列の長さをインターセプトする (中国語と英語の混合文字列)_PHP チュートリアル

PHP が文字列の長さをインターセプトする (中国語と英語の混合文字列)_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 16:56:341207ブラウズ

この記事では、PHP に付属するインターセプト関数から、最終的に中国語、英語、および中国語と英語の混合文字列インターセプト方法をサポートするまでの文字列インターセプト関数を紹介しています。必要な友人は参照してください。

文字列の一部を取得します。

構文: string substr(string string, int start, int [length]);

戻り値: 文字列

機能タイプ: データ処理

コンテンツの説明

この関数は、文字列の開始位置から長さの文字を抽出します。 start が負の数の場合、文字列の末尾から開始されます。省略されたパラメータ長が存在するが、負の数の場合は、下からの長さの文字を取得することを意味します。

使用例

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


echo substr("abcdef", 1, 3); // "bcd" を返します
echo substr("abcdef", -2); // "ef" を返します
echo substr("abcdef", -3, 1); // "d" を返します
echo substr("abcdef", 1, -1); // "bcde" を返します
?>

上記は英語のみをサポートしており、中国語はサポートしていません


GB2312 中国語文字列をインターセプトします

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

//中国語の文字列をインターセプトします
関数 mysubstr($str, $start, $len) {
$tmpstr = ""; $strlen = $start + $len
; for($i = 0; $i If(ord(substr($str, $i, 1)) > 0xa0) {
$tmpstr .= substr($str, $i, 2); $i++; } 他
$tmpstr .= substr($str, $i, 1); }
$tmpstr を返す
}
?>



utf8 でエンコードされたマルチバイト文字列をインターセプトします

コードは次のとおりです

コードをコピー // utf8 文字列をインターセプトします 関数 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); }
?>



/*
※機能:文字化けしない点以外はsubstrと同じです
* パラメータ:
* リターン:
*/

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

関数 utf8_substr( $str , $start , $length=null ){

//最初にそれを傍受します $res = substr( $str, $start, $length);
$strlen = strlen( $str );

/* 次に、最初と最後の 6 バイトが完全である (不完全ではない) かどうかを判断します */

// パラメータ start が正の数の場合

if ( $start >= 0 ){
// 約 6 バイト前方をインターセプトします
$next_start = $start + $length; // 初期位置
; $next_len = $next_start + 6 $next_segm = substr( $str , $next_start , $next_len );

// 最初のバイトが完全な文字の最初のバイトではない場合、末尾から約 6 バイトをインターセプトします

$prev_start = $start - 6 > $start - 6 : 0; $prev_segm = substr( $str , $prev_start , $start - $prev_start );
}
// 開始は負の数です
その他{
// 約 6 バイト前方をインターセプトします
$next_start = $strlen + $start + $length; // 初期位置
; $next_len = $next_start + 6 $next_segm = substr( $str , $next_start , $next_len );
                                                // 最初のバイトが完全な文字の最初のバイトではない場合、約 6 バイトをインターセプトします。
$start = $strlen + $start;
$prev_start = $start - 6 > $start - 6 : 0; $prev_segm = substr( $str , $prev_start , $start - $prev_start );
}

// 最初の 6 バイトが utf8 ルールに準拠しているかどうかを判断します
If ( preg_match( '@^([x80-xBF]{0,5})[xC0-xFD]?@' , $next_segm , $bytes ) ){
If ( !empty( $bytes[1] ) ){

$bytes = $bytes[1];

$res .= $bytes;
}
}

// 最後の 6 バイトが utf8 ルールに準拠しているかどうかを判断します
$ord0 = ord( $res[0] );
If ( 128 = $ord0 ){
// それを元に戻し、res の前に追加します。
If ( preg_match( '@[xC0-xFD][x80-xBF]{0,5}$@' , $prev_segm , $bytes ) ){
If ( !empty( $bytes[0] ) ) {
$bytes = $bytes[0];
$res = $bytes;
}
}
}

$res を返す;
}

テストデータ::

コードは次のとおりです コードをコピー
$str = 'dfjdjf test 13f test 65&2 data¹(1 is mfe&...just';
var_dump( utf8_substr( $str , 22 , 12 ) ); echo '
var_dump( utf8_substr( $str , 22 , -6 ) ); echo '
var_dump( utf8_substr( $str , 9 , 12 ) ); echo '
var_dump( utf8_substr( $str , 19 , 12 ) ); echo '
var_dump( utf8_substr( $str , 28 , -6 ) ); echo '


显示结果::(截取无乱码, 欢迎大家测试, 提交bug)
string(12) "据fdj"
string(26) "据fdj(1就mfe&…"
string(13) "13f试65&2数"
string(12) "数据fd"
string(20) "dj(1就mfe&…"

把我常用的分享出来

下面我们再来看中文截函数吧。

 代码如下 复制代码

function MooCutstr($string, $length, $dot = ' ...') {
 global $charset;

 if(strlen($string) <= $length) {
return $string;
}
$string = str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), $string);
 $strcut = '';
 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++; $noc++;
} elseif (194 <= $t && $t <= 223) {
$tn = 2; $n += 2; $noc += 2;
} elseif (224 <= $t && $t < 239) {
$tn = 3; $n += 3; $noc += 2;
} elseif (240 <= $t && $t <= 247) {
$tn = 4; $n += 4; $noc += 2;
} elseif (248 <= $t && $t <= 251) {
$tn = 5; $n += 5; $noc += 2;
} elseif ($t == 252 || $t == 253) {
$tn = 6; $n += 6; $noc += 2;
} else {
$n++;
}
if($noc >= $length) {
    break;
   }
  }
  if($noc > $length) {
   $n -= $tn;
  }
  $strcut = substr($string, 0, $n);
 } else {
  for($i = 0; $i < $length; $i++) {
$strcut .= ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i];
  }
 }
 //$strcut = str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), $strcut);

 return $strcut.$dot;
}

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/631589.htmlTechArticle文章介绍了字符串截取函数从php自带的截取函数到最后支持中文,英文和中英文混合字符串截取方法介绍,有需要的朋友可参考一下。 取部...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。