ホームページ > バックエンド開発 > PHPチュートリアル > PHP 7.3 にアップグレードした後、PHP 正規表現で「preg_match(): コンパイルに失敗しました: 文字クラスの範囲が無効です」というエラーが発生するのはなぜですか?

PHP 7.3 にアップグレードした後、PHP 正規表現で「preg_match(): コンパイルに失敗しました: 文字クラスの範囲が無効です」というエラーが発生するのはなぜですか?

Susan Sarandon
リリース: 2024-12-06 01:37:13
オリジナル
244 人が閲覧しました

Why Does My PHP Regex Produce

文字クラスの無効な範囲: PHP アップグレード後の問題について

エラー メッセージ「preg_match(): コンパイルに失敗しました: 文字クラスの範囲が無効です」は問題を示しています提供されたコードで使用されている正規表現を使用します。この問題は、PHP のアップグレード後、特に PCRE2 ライブラリの変更により以前のバージョンから PHP 7.3 以降に移行する場合に発生する可能性があります。

PHP 7.3 での PCRE2 への移行

PHP 7.3 の場合、PHP PCRE エンジンが PCRE2 に移行したため、いくつかの下位互換性がなくなりました。変更点:

  • パターンが自動的に調査されるため、「S」修飾子は無効です。
  • 「X」修飾子は PCRE2 のデフォルトとして動作し、重大な影響はありません。
  • Unicode 10 は PCRE2 に実装されており、無効な動作の変更が導入される可能性があります。

文字クラスのハイフン: PHP 7.3 以前と以降

PHP 7.3 より前では、ハイフンは、エスケープするか、使用できない場所に配置すれば、文字クラス内の任意の位置で使用できました。範囲を示すものではありません。ただし、PHP 7.3 以降では、PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL はデフォルトで false に設定されています。

したがって、文字クラスにハイフンを含めるには:

  • ハイフンを先頭または末尾で使用します。のclass.

例:

提供されたコードで、問題のある行は次のとおりです:

if(!preg_match("/^[a-z0-9]([0-9a-z_-\s])+$/i", $subuser)){
ログイン後にコピー

問題は文字内のハイフン (-) です。クラス [0-9a-z_-s]。これを修正するには、末尾または先頭にハイフンを置きます:

if(!preg_match("/^[a-z0-9]([0-9a-z\_-\s0-9a-z\_-\s])+$/i", $subuser)){
ログイン後にコピー

追加の参考資料:

「PHP 7.3: PCRE2 has Remove PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL」でさらに詳しい情報が得られます:

PCRE2 はパターン検証がより厳密であるため、アップグレード後は、既存のパターンはコンパイルできなくなりました。

そのため、PHP 7.3 以降のバージョンの PCRE2 との互換性を確保するには、既存のパターンを綿密に調査し、変更する必要がある場合があります。

以上がPHP 7.3 にアップグレードした後、PHP 正規表現で「preg_match(): コンパイルに失敗しました: 文字クラスの範囲が無効です」というエラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート