discuz と ecshop インターセプト文字列関数の PHP バージョンを比較する
次に、最初にソース コードと 2 つのバージョンの関数の簡単なテストを示します。最後に、より実用的な文字列インターセプト関数を示します。ここで説明する文字列インターセプトの問題はすべて、UTF-8 でエンコードされた中国語文字列に関するものであることに注意してください。
ディスクバージョン
コードをコピー コードは次のとおりです:
/**
* [discuz] mb_substr やその他の拡張機能がインストールされていない PHP に基づくインターセプト文字列。中国語文字がインターセプトされた場合、2 文字として計算されます。
* @param $string インターセプトされる文字列
* @ param $length to be インターセプトされた文字数
* @param $dot 切り捨てられた部分の終了文字列を置き換えます
* @return インターセプトされた文字列を返します
* /
function Cutstr($string, $length, $dot = '...') {
// 文字列がインターセプトする長さより短い場合は、直接戻ります
//ここで strlen を使用して文字を取得します。 文字列の長さには大きな欠点があります。たとえば、文字列「Happy New Year」
// から 4 つの中国語文字をインターセプトしたい場合は、これら 4 つの中国語のバイト数を知る必要があります。それ以外の場合、返される文字列は「Happy New Year...」になります。
if (strlen($string) <= $length) {
return $string
}
// 変換元の文字列の htmlspecialchars
$pre = chr(1);
$string = str_replace (array ('&', '"', '<', '>' )、配列 ($pre . '&' . $end, $pre . '"' . $end, $pre . '<' . $end, $pre . '>' . $end ) , $string );
$strcut = ''; // 初期化戻り値
// utf-8エンコードの場合(この判定はちょっと不完全なのでutf8の可能性があります)
if (strto lower) ( CHARSET ) == 'utf-8') {
//初期連続ループポインタ $n、最後の文字数 $tn、インターセプトされた文字数 $noc
$n = $tn = $noc = 0;
while ( $n < strlen ( $string ) ) {
$t = ord ( $string [$n] );
if ($t == 9 || $t = = 10 || (32 <= $t && $t <= 126)) {
// 英語の半角記号などの場合は $n ポインタが 1 桁戻り、 $tn の最後の単語は 1 桁です
$tn = 1;
$noc ;
} elseif (194 <= $t && $t <= 223)
// 2 バイト文字の場合、$n ポインタは 2 ビット戻り、$tn の最後のワードは 2 ビットになります
$tn = 2; ;
$noc = 2;
} elseif (224 <= $t && $t <= 239) {
/ / 3 バイトの場合 (中国語の単語として理解できます) $n は 3 桁シフトされ、$tn の最後のワードは 3 桁になります。
$n = 3;
$noc = 2; <= $t && $t <= 247) {
$tn = 4;
$noc = 2; && $t <= 251) {
$tn = 5;
$noc = 2;
} elseif ($ t == 252 || $t == 253) {
$tn = 6;
$n = 2;
} else {
}
//取得する数を超えた場合の連続ループの
if ($noc >= $length) {
break;
}
}
// ここは、 $dot を追加する準備中の最後の単語
if ($noc > $length) {
$n -= $tn;
}
$strcut = substr ( $ string, 0, $n );
} else {
// utf-8 ではない全角エンコーディングは 2 ビットだけシフトバックされます
for ($i = 0; $i $strcut .= ord ( $string [$i] ) > $string [$i] : $string [$i];
// 元の htmlspecialchars を復元します
$strcut = str_replace( array ($pre . '&' . $end, $pre . '"' . $end, $pre . '<' . $ end, $pre . '>$end )、array ('&'、'"'、'<'、'>' )、$strcut );
$pos = strrpos ( 1 ) );
if ($pos !== false) {
$strcut = substr ( $strcut, 0, $pos );
return $strcut ;最後に、インターセプトを $dot 出力に追加します
}
discuz バージョンの最大の欠陥は、strlen を使用して元の文字列の長さを取得し、それを受信長パラメーターで使用することです。 UTF-8 の中国語文字のバイト数は固定されていないため、次のジレンマに直面します。4 つの中国語文字をインターセプトしたい場合、どのくらいのインターセプト長を指定する必要がありますか? 8バイトですか、それとも12バイトですか? 。 。 。これは予測不可能であり、次のテスト結果からわかるように、この問題が原因で discuz の Cutstr には実際にはバグがあります:
Copy code
コードは次のとおりです:
$str1 = "貧乏になりたい";
echo my_cutstr($str1, 10, "...")."n";出力: 貧乏になりたいという願望 Qianmile... [これはバグです。原因を考えてください。 ]
echo my_cutstr($str1, 15, "...")."n"; // 出力: Yuqiongqianlimu
上記のバグの理由は、 Cutstr 関数は、文字をインターセプトするときに、中国語の文字は 2 文字としてカウントされるため、5 つの中国語の文字は 10 文字となり、元の文字列の長さは 15 バイトであるため、cutstr は 15 文字の文字列から「正常に」インターセプトされたとみなします。 10文字に「しっぽ」を追加しました。このバグを解決するには、返された部分文字列が元の文字列と同じかどうかを確認するだけです。同じである場合は、「末尾」を追加しないでください。
ecshop バージョン
コードをコピー
コードは次のとおりです:
/**
* [ecshop] PHP の mb_substr および iconv_substr 拡張機能に基づいて、これら 2 つの拡張機能は文字列をインターセプトするために使用されます。
* この関数は、utf-8 でエンコードされた中国語文字列にのみ適用されます。 。
*
* @param $str 元の文字列
* @param $length インターセプトされた文字数
* @param $append 終了文字列を切り詰められた部分に置き換えます
* @return Returnインターセプトされた文字列
*/
function sub_str($str, $length = 0, $append = '...') {
$str =trim($str);
$strlength = strlen($str);
if ($length == 0 || $length >= $strlength) {
return $str>} elseif ($length < 0) {
$length = $strlength $length;
if ($length $length = $strlength;
}
}
if ( function_exists( 'mb_substr') ) {
$newstr = mb_substr($str, 0, $length, 'utf-8')
} elseif ( function_exists('iconv_substr') ) {
$newstr = iconv_substr ($str, 0, $length, 'utf-8');
} else {
//$newstr = trim_right(substr($str, 0, $length)); substr($str, 0, $length);
}
if ($append && $str != $newstr) {
$newsstr .= $append;
return $ newstr;
}
ecshop 版の特徴と欠点は、元の文字列に中国語が含まれていない場合 (例: abcd1234)、中国語の文字が 1 文字としてカウントされることです。 4 つの中国語文字または 8 つの英語文字をインターセプトすることを目的としている場合、ecshop バージョンを使用すると、期待される結果が得られません: abcd。以下は簡単なテスト結果です:
コードをコピー
コードは次のとおりです: $str1 = "太陽は山を越え、黄河は海へ";
echo $str1."n";echo my_sub_str($str1, 4, "...")."n"; //出力: 山には太陽が輝いています...
$str2 = "白1日2伊3山4";
echo $str2."n"; , "...")."n"; // 出力: White 1st 2...
最適化バージョン
コードをコピー
コードは次のとおりです: /*** 文字列インターセプト、中国語の文字は 2 文字として計算され、GBK と UTF-8 エンコーディングの両方がサポートされています
* @param $string インターセプトされる文字列* @param $length 文字数インターセプトされる
* @param $append 部分文字列に追加された末尾
* @return インターセプトされた文字列を返します
*/
function substring($string, $length, $append = false) {
if ( $length return '';
}
// 元の文字列が UTF-8 でエンコードされているかどうかを確認します
$is_utf8 = false;
$str1 = @iconv("UTF-8", "GBK", $string);
$str2 = @iconv("GBK", "UTF-8", $str1); ( $string == $str2 ) {
$is_utf8 = true;
// UTF-8 エンコードの場合は、GBK エンコードを使用します
$string = $str1>}
$ newstr = '';
for ($i = 0 ; $i $newstr .= ord ($string[$i]) > 127 ? i] . $string[ $i] : $string[$ i];
}
if ( $is_utf8 ) {
$newstr = @iconv("GBK", "UTF-8", $ newstr);
}
if ($append && $newstr != $string) {
$newstr .= $append;
}
return $newstr; >
テスト結果を以下に示します (GBK と UTF-8 の結果は一致しています):
コードをコピー
コードは次のとおりです
$str1 = "太陽は山を越え、黄河は海に流れ込みます。"
echo substring($str1, 4, "..."); n"; // 出力: 昼間... echo substring($str1, 5, ".. .")."n"; // 出力: Bai Riyi... $str2 = "12白 34 位 56 易 78 山"; echo substring($str2, 4, "... ")."n"; // 出力: 12 白... echo substring($str2, 5, "...")."n"; // 出力: 12 白 3...
著者: edwardlost のブログ

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7
