PHPでは、 MB_EREGI_REPLACE関数を使用して、マルチバイト文字を定期的に交換し、ケースを無視します。 UTF-8などのマルチバイトエンコードされた文字列を処理するのに非常に役立ちます。ただし、実際に使用すると、入力文字列にいくつかの違法文字(正規表現の特殊文字などが逃げられないなど)が含まれている場合、しばしば定期的なマッチングの障害またはエラー報告につながります。
この記事では、 MB_EREGI_REPLACE関数を使用する前に、違法なキャラクターによる正規表現障害の問題を回避する前に、プリセス文字列を紹介する方法を紹介します。
MB_EREGI_REPLACEの最初のパラメーターは正規表現パターン、2番目のパラメーターは置換コンテンツ、3番目のパラメーターは処理される文字列です。
例:
<?php
$text = "Hello World!";
$pattern = "world";
$replacement = "PHP";
echo mb_eregi_replace($pattern, $replacement, $text);
?>
出力は次のとおりです。
Hello PHP!
ただし、 $パターンまたは保留中の文字列に無効な特殊文字が含まれている場合、試合が失敗する可能性があり、警告さえ投げられます。
正規表現で特別な意味を持つキャラクターは次のとおりです。
. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
これらの文字がパターンまたは文字列に置き換えるように表示される場合、それらは正しく逃げる必要があります。
PHP独自の関数preg_quote()は、正規表現で特殊文字を逃れることができます。しかし、 MB_EREGI_REPLACEは、 PREG_*シリーズPCREではなくMBREGEX拡張機能の規則性を使用し、エスケープルールはわずかに異なりますが、通常、 preg_quoteはほとんどの特殊文字がまだ有効です。
例:
<?php
$pattern_raw = "hello.world"; // . それは特別なキャラクターです
$pattern = preg_quote($pattern_raw, '/'); // ASを脱出します hello\.world
$text = "Hello World! hello.world test.";
echo mb_eregi_replace($pattern, "PHP", $text);
?>
出力:
Hello World! PHP test.
保留中の文字列に、試合が失敗する原因となるコントロール文字(印刷されていない文字など)が含まれていることを心配している場合は、最初に規則性でフィルタリングできます。
<?php
// 印刷されていない文字を削除します,一般的なキャラクターと中国語のみが保存されています
$clean_text = preg_replace('/[^\P{C}\n]+/u', '', $text);
次の例は、 MB_EREGI_REPLACEを呼び出して、文字列内の違法文字を事前に処理する前に、パターンの特殊文字を逃れる方法を示しています。
<?php
// 交換する必要がある文字列とパターン
$pattern_raw = "foo.bar?"; // 特殊文字が含まれています . そして ?
$replacement = "PHP";
$text = "Hello foo.bar? world! \x01\x02"; // コントロール文字を含めます
// 1. エスケープモードの特殊文字
$pattern = preg_quote($pattern_raw, '/');
// 2. 前処理されたテキスト,コントロール文字を削除します
$clean_text = preg_replace('/[^\P{C}\n]+/u', '', $text);
// 3. 使用mb_eregi_replace交換します(ケースを無視します)
$result = mb_eregi_replace($pattern, $replacement, $clean_text);
echo $result;
?>
出力: