現在の位置: ホーム> 最新記事一覧> MB_EREGI_REPLACE関数を使用して定期的な障害を防ぐ前に、文字列で違法なキャラクターを前処理する方法は?

MB_EREGI_REPLACE関数を使用して定期的な障害を防ぐ前に、文字列で違法なキャラクターを前処理する方法は?

M66 2025-06-15

PHPでは、 MB_EREGI_REPLACE関数を使用して、マルチバイト文字を定期的に交換し、ケースを無視します。 UTF-8などのマルチバイトエンコードされた文字列を処理するのに非常に役立ちます。ただし、実際に使用すると、入力文字列にいくつかの違法文字(正規表現の特殊文字などが逃げられないなど)が含まれている場合、しばしば定期的なマッチングの障害またはエラー報告につながります。

この記事では、 MB_EREGI_REPLACE関数を使用する前に、違法なキャラクターによる正規表現障害の問題を回避する前に、プリセス文字列を紹介する方法を紹介します。


1。問題の背景

MB_EREGI_REPLACEの最初のパラメーターは正規表現パターン、2番目のパラメーターは置換コンテンツ、3番目のパラメーターは処理される文字列です。

例:

 <?php
$text = "Hello World!";
$pattern = "world";
$replacement = "PHP";

echo mb_eregi_replace($pattern, $replacement, $text);
?>

出力は次のとおりです。

 Hello PHP!

ただし、 $パターンまたは保留中の文字列に無効な特殊文字が含まれている場合、試合が失敗する可能性があり、警告さえ投げられます。


2。定期的な失敗を引き起こす可能性のある違法なキャラクター

正規表現で特別な意味を持つキャラクターは次のとおりです。

 . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

これらの文字がパターンまたは文字列に置き換えるように表示される場合、それらは正しく逃げる必要があります。


3.前処理手順

3.1通常の特殊文字を逃がします

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.

3.2違法文字をフィルターまたは交換します

保留中の文字列に、試合が失敗する原因となるコントロール文字(印刷されていない文字など)が含まれていることを心配している場合は、最初に規則性でフィルタリングできます。

 <?php
// 印刷されていない文字を削除します,一般的なキャラクターと中国語のみが保存されています
$clean_text = preg_replace('/[^\P{C}\n]+/u', '', $text);

4。包括的な例

次の例は、 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;
?>

出力: