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

PHP 7.3 にアップグレードした後、PHP preg_match() が「文字クラスの範囲が無効です」エラーで失敗するのはなぜですか?

Barbara Streisand
リリース: 2024-12-15 10:00:21
オリジナル
494 人が閲覧しました

Why is my PHP preg_match() failing after upgrading to PHP 7.3 with a

preg_match(): Compilation Failed Due to Invalid Character Class Range

エラー メッセージ「preg_match(): コンパイルに失敗しました: 範囲が無効です」オフセット 20 の文字クラス」は、正規表現パターンに無効な文字クラス範囲が含まれていることを示します。この場合、サーバー上の PHP アップグレード後に問題が突然発生したため、その理由を調べます。

エラーの理由:

PHP 7.3 PCRE (Perl 互換正規表現) エンジンを PCRE2 にアップグレードしました。これにより、パターンの厳密な検証など、いくつかの変更が加えられました。特に、ハイフン (-) 文字は文字クラスで異なる方法で扱われるようになりました。

コード スニペット:

提供されたコードは正規表現を使用してユーザー名を検証します:

/^[a-z0-9]([0-9a-z_-\s])+$/i
ログイン後にコピー

以前のバージョンの PHP では、ハイフンは文字クラス内のどこでも使用できました。エスケープされたか、範囲のインジケーターとして解釈できない場所に配置されました。

PHP 7.3 の影響:

PCRE2 では、エスケープ () は no ですハイフン付き文字クラスでは無視されるようになりました。これは、PHP 7.3 以降では、上記のコードを次のように更新する必要があることを意味します:

/^[a-z0-9]([0-9a-z_-]\s)$/i
ログイン後にコピー

解決策:

コンパイル エラーを解決するには、ハイフンで囲まれた文字がクラスは次のルールに従います:

  • 開始位置または終了位置にハイフンを使用します。
  • ハイフンが他の位置にある場合は、バックスラッシュ () でエスケープします。

追加情報:

  • Unicode プロパティ エスケープに関する公式 PHP ドキュメントでは、PCRE の以前のバージョンではハイフンがリテラル文字として扱われていたと説明されています。文字クラスの任意の場所。
  • PCRE2 では、無効な文字クラス範囲に対して特定のエラーがスローされるようになり、問題がより明確になりました。
  • 7.3 より前の PHP バージョンの場合、回避策は次のとおりです。ハイフンをエスケープしますが、これは PHP 7.3 以降では必要なくなりました。

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

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