マルチバイト文字エンコードを扱うとき、PHPはICONV_STRRPOS関数を提供して、文字列内のサブストリングの最後の発生を見つけます。この関数は、従来のSTRROがバイトセグメンテーションエラーのために位置計算を誤って整列させる可能性があるため、UTF-8などのマルチバイトエンコードを処理するために特に重要です。ただし、PHPバージョンのアップグレードにより、 ICONV_STRRPOSの動作も詳細に変化し、これらの違いを理解することは、開発者が潜在的な互換性の問題を回避するために重要です。
iconv_strrposの使用はstrrposに似ており、その関数定義は次のとおりです。
int iconv_strrpos ( string $haystack , string $needle [, int $offset = 0 [, string $encoding = ini_get("iconv.internal_encoding") ]] )
$ haystack :検索する文字列。
$針:見つかるサブストリング。
$ offset :開始位置を検索します(デフォルトは0、負の数がサポートされています)。
$エンコード:文字列エンコード、デフォルトはiconv.internal_encodingから取得されます。
返品値は、 $針が表示されたときに最後の文字位置(バイトではなく文字に基づいています)であり、見つからないときにfalseを返します。
iconv_strrposは、$ offsetパラメーターを処理するときに不安定に動作します。負のオフセットが機能しない場合があり、エラーリターンにつながる可能性があります。
デフォルトのエンコーディングは、 iconv.internal_encodingに依存します。明示的に設定されていない場合、マルチバイトエンコード認識が失敗する可能性があります。
一部のバグにより、 $針の長さが1より大きい場合、関数が例外を返します。
$ offsetの処理はより正確で、負の数のサポートは完璧であり、ドキュメントの説明と一致しています。
デフォルトのエンコードパラメーターは、明示的に渡され、構成への依存度を低減し、環境が異なるための違いを回避することをお勧めします。
$針のマルチバイトストリングマッチングの場合、リターン偏差、パフォーマンス、安定性の改善を解決しました。
いくつかのPHP 7.2バージョンの前に、特定のエッジバグがあり、より信頼性の高いパフォーマンスのためにPHP 7.3+にアップグレードすることをお勧めします。
ICONV_STRRPOSは正しいエンコードパラメーターに依存します。そうしないと、文字列の長さが誤解されるか、マッチングが失敗します。必ず明示的に$エンコードを渡すようにしてください。明示的に書くことをお勧めします。
$pos = iconv_strrpos($str, $needle, 0, 'UTF-8');
$ offsetは、バイトではなく文字ベースのインデックスです。
負のオフセットは、文字列の端の逆数から計算された開始点を示します。
初期のPHPバージョンには、ネガティブなオフセットに対するサポートが不十分だったため、使用する際にバージョンの互換性に注意する必要があります。
文字位置(0から始まる)、非バイト位置を返します。
falseが見つからず、 Falseと整数0がタイプを審査するときに簡単に混乱する場合は、合同判断を使用することをお勧めします。
if ($pos === false) {
echo "サブストリングは見つかりません";
} else {
echo "場所はです: $pos";
}
$針にマルチバイト文字が含まれている場合、PHP 7+は処理がより正確です。 ICONV_STRRPOSの代わりにシングルバイトの文字列関数を使用して、文字化けやオフセットエラーを避けないでください。
<?php
// 仮定 $str 中国語に含まれています
$str = "これはテスト文字列テストです";
// PHP 7+ 執筆をお勧めします,明確にエンコードされています
$needle = "テスト";
$pos = iconv_strrpos($str, $needle, 0, 'UTF-8');
if ($pos !== false) {
echo "最後に表示されるのはです: $pos\n";
} else {
echo "サブストリングは見つかりません\n";
}
出力:
最後に表示されるのはです: 8
古いバージョンでは、エンコードが指定されていない場合、エラーまたはfalseが出力される場合があります。
ICONV_STRRPOSは、マルチバイト文字列処理に不可欠な機能ですが、その動作はPHPバージョンとエンコーディング設定に依存します。
デフォルトの構成に依存しないように、開発中にエンコーディングを明示的に渡す必要があります。
負の$オフセット値サポートの場合は、必ずPHP 7以上を使用してください。
0とfalseの間の混乱を防ぐために返品値を使用する場合は、タイプの判断に注意してください。
プログラムが正しく実行されることを確認するために、PHPバージョンをアップグレードするときに関連する関数の互換性テストを実行することをお勧めします。