PHPでは、 substr_count()関数は、サブストリングが文字列に表示される回数を計算するために広く使用されています。 ASCIIキャラクターを扱う場合は非常に効率的ですが、UTF-8などのマルチバイト文字エンコーディングに直面した場合、予期しない結果が得られる場合があります。この記事では、マルチバイト文字エンコードを扱う際にsubstr_count()の実用的なスキルを紹介し、特定の例を通じて開発の落とし穴を回避するのに役立ちます。
substr_count()の基本的な構文は次のとおりです。
<code> int substr_count(string $ haystack、string $ edele [、int $ offset = 0 [、int $ length]] </code>この関数は、 $ haystackに表示される$針の回数を返します。文字列をバイトで処理し、文字境界を認識しない関数であることに注意する必要があります。
たとえば、漢字「あなた」が文字列に表示される回数をカウントしようとすると、エラーが発生する可能性があります。
<Code> $ str = "こんにちは、本当に良い"; echo substr_count($ str、 "you"); //出力が正しくない場合があります</code>その理由は、中国語の「あなた」はUTF-8の3バイトであるが、 substr_count()は文字の境界を認識せず、バイトのみが一致するからです。この状況は、エラーの一致や数字の欠落に簡単につながる可能性があります。
PHPには特別なMB_SUBSTR_COUNT()関数はありませんが、 MB_SUBSTR()やMB_STRLEN()などの関数を組み合わせることで同様の効果を実現できます。
たとえば、 mb_split()を使用して文字列を分割し、発生数をカウントできます。
<Code> $ str = "こんにちは、本当に良い"; $ arr = mb_split( "you"、$ str); $ count = count($ arr)-1; echo $ count; //正しい出力2 </code>このようにして、バイトレベルの誤判断の問題は回避され、マルチバイトエンコーディングに適しています。
別の一般的な方法は、UTF-8モディファイアでpreg_match_all()を使用することです。
<Code> $ str = "こんにちは、本当に良い"; preg_match_all( '/you/u'、$ str、$ matches);エコーカウント($ matches [0]); //出力2 </code>ここの/u修飾子は、RegengineにUTF-8モードを使用して文字列を処理するように指示し、したがって「you」がキャラクターとして正しく認識されるようにします。
URLを含む文字列を処理している場合、URLには中国のパスまたはパラメーターが含まれている場合は、 rawurlencode()またはurldecode()を使用して一致する前に均一に処理することをお勧めします。例えば:
<Code> $ url = "https://gitbox.net/hello/hello.html"; $ decoded = urldecode($ url); preg_match_all( '/hello/u'、$ decoded、$ matches);エコーカウント($ matches [0]); //出力2 </code>これにより、URLエンコード後の中国からの干渉を回避し、統計の精度を確保できます。
substr_count()自体は、マルチバイト文字エンコードには適していませんが、次の手法によって効果的に補償できます。
mb_split()を使用して分割してカウントします
正規表現を使用して、 preg_match_all()を/u修飾子と一致させます
URLでpreprocessingを実行し、それを一致させます
Substr_count()を直接使用して、中国語、日本語、韓国語などのマルチバイト文字の周波数分析を実行しないでください
これらのスキルを習得すると、多言語Webサイトを開発したり、自然言語の処理をしたり、 gitbox.netなどのプラットフォームからUTF-8データを処理する際に、プログラムの正確性と安定性を大幅に向上させることができます。