ホームページ バックエンド開発 PHPチュートリアル PHP の通常の失敗 - 最大バックトラッキング (pcre.backtrack_limit)/再帰制限

PHP の通常の失敗 - 最大バックトラッキング (pcre.backtrack_limit)/再帰制限

Jun 13, 2016 pm 12:50 PM
error limit pcre

PHP 正規表現のエラー - 最大バックトラッキング (pcre.backtrack_limit)/再帰制限

昨日、同僚が通常の定期収集プログラムに取り組んでいて、奇妙な現象を発見しました。何気なく書いているのですが、サーバーにアップロードしてみると、どうやって正規表現を書いても一致しないことが分かりました。長期間調整しても効果がなかったので、諦めていませんか?それから...私は負けるつもりはありませんでした...夕食後、パソコンを立ち上げて、正規表現のルールについて何気なくブログを書いたり、正規表現の書き方などについて話し続けました。ようやく落ち着いて分析してみました。

同僚と私はコンピューターに WAMP をインストールしていますが、PHP のバージョンは 5.3.x で、サーバーの PHP のバージョンは 5.2.x です。これが問題なのでしょうか? pcre 関数 - preg_match_all、いいですね。preg_last_error 関数があることがわかりました。それを開いて調べたところ、返されたエラーは PREG_BACKTRACK_LIMIT_ERROR でした。問題があるため、コードの先頭に追加しました。結果は正常にキャプチャされます。マニュアルを振り返ってみると、次のような紹介文がありました:


最後に、オンラインでいくつかの情報を確認しました。ブロガーの 1 人が非常に詳細な情報を書いていました。関連するコンテンツと説明をいくつか示します。

PHP の拡張子 pcre には 2 つの設定項目が用意されています。


1 pcre.backtrack_limit //バックトラックの最大数
2 pcre.recursion_limit //ネストの最大数


デフォルトの backtarck_limit は 100000 (100,000) です。
さて、この問題の原因を解明するには、「バックトラッキング」とは何かが鍵となります。
この正規表現は、非貪欲モードを使用します。非貪欲パターン マッチングの原理は、単純に、一致または不一致の場合に、不一致を優先して記録し、一致制御を引き継ぎます。正規表現文字の次の一致。その後の一致が失敗した場合は、戻って一致します。

例: ソース文字列: aaab 正規: .*?
マッチング処理が開始されると、まず「.*?」がマッチング制御を取得します。これは非貪欲モードであるため、最初はマッチングせず、次にマッチングした文字「b」にマッチング制御を渡します。ソース文字列の位置 1 でエラー (「a」) が発生したため、バックトラックして一致する制御を「.*?」に戻します。この時点で、「.*?」は文字「a」に一致し、制御を に渡します。もう一度「b」、というようにして、最終的に一致する結果が得られ、このプロセスで合計 3 回のバックトラッキングが発生しました。



最後に、まだ言いたいことがあります

1. PHP 5.2 以降では、次の機能が提供されます。 int preg_last_error (void) 最後の PCRE 正規表現実行のエラー コードを返します。

この関数の戻り値がゼロでない場合は、特に記事の例ではエラー (PREG_BACKTRACK_LIMIT_ERROR) が返されたことを意味します。 2. 非貪欲モードではバックトラッキングが多すぎるため、必然的にパフォーマンスの問題が発生します。この問題は、特に大量のデータを扱うテキスト処理を行う場合に、通常のルールを適切に記述することで回避できます。慎重に設計しないと、非常に困難になります。また、パフォーマンスを考慮して、代わりに文字列処理を使用することをお勧めします。



このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP 致命的エラーの解決策: 未定義メソッド PDO::prepare() の呼び出し PHP 致命的エラーの解決策: 未定義メソッド PDO::prepare() の呼び出し Jun 22, 2023 pm 06:40 PM

PHP は、長い間使用されている人気のある Web 開発言語です。 PHP に統合された PDO (PHP Data Object) クラスは、Web アプリケーションの開発中にデータベースと対話する一般的な方法です。ただし、一部の PHP 開発者がよく遭遇する問題は、PDO クラスを使用してデータベースと対話するときに、次のようなエラーが表示されることです。

Vue アプリケーションで axios を使用しているときに「Uncaught (in Promise) Error: Request failed with status code 500」が発生した場合はどうすればよいですか? Vue アプリケーションで axios を使用しているときに「Uncaught (in Promise) Error: Request failed with status code 500」が発生した場合はどうすればよいですか? Jun 24, 2023 pm 05:33 PM

Vue アプリケーションで axios を使用するのは非常に一般的です。axios は、ブラウザーと Node.js で使用できる Promise ベースの HTTP クライアントです。開発プロセス中に、「Uncaught(inpromise)Error: Requestfailedwithstatuscode500」というエラー メッセージが表示されることがありますが、開発者にとって、このエラー メッセージは理解および解決が難しい場合があります。この記事ではこれについて説明します

0271: リアルタイムクロックエラーによりコンピュータの電源が入らない場合はどうすればよいですか? 0271: リアルタイムクロックエラーによりコンピュータの電源が入らない場合はどうすればよいですか? Mar 13, 2023 am 11:30 AM

起動できない「0271: リアルタイム クロック エラー」の解決策: 1. F1 キーを押し、表示されるインターフェイスでオプション バーを 3 番目の項目「日付/時刻」に移動します; 2. システム時刻を手動で現在の時刻に変更します。 1 回; 3. F10 キーを押し、ポップアップ ダイアログ ボックスで [はい] を選択します; 4. ノートブックを再度開いて、通常どおり起動します。

C++ コードの「エラー: 'datatype' の前に初期化子が必要です」問題を解決する C++ コードの「エラー: 'datatype' の前に初期化子が必要です」問題を解決する Aug 25, 2023 pm 01:24 PM

C++ コードの「error:expectedinitializerbefore'datatype'」問題を解決します。C++ プログラミングでは、コードを作成するときにコンパイル エラーが発生することがあります。一般的なエラーの 1 つは、「error:expectedinitializerbefore'datatype'」です。このエラーは通常、変数宣言または関数定義で発生し、プログラムが正しくコンパイルされなかったり、

C++ コードの「エラー: 不完全な型は許可されません」の問題を解決する C++ コードの「エラー: 不完全な型は許可されません」の問題を解決する Aug 26, 2023 pm 08:54 PM

C++ コードの「error:incompletetypeisnotallowed」問題を解決します。C++ プログラミング プロセス中に、コンパイル エラーが発生することがあります。一般的なエラーの 1 つは、「error:incompletetypeisnotallowed」です。このエラーは通常、不完全な型を操作することによって発生します。この記事では、このエラーの原因を説明し、いくつかの解決策を提供します。まず、私は

Laravelのtakeとlimitの使い方を詳しく解説 Laravelのtakeとlimitの使い方を詳しく解説 Mar 10, 2024 pm 05:51 PM

「Laravelのtakeとlimitの使い方を詳しく解説」 Laravelではtakeとlimitの2つがよく使われており、データベースクエリで返されるレコード数を制限するために使用されます。これらの機能は似ていますが、特定の使用シナリオでは微妙な違いがいくつかあります。この記事では、これら 2 つのメソッドの使用法を詳細に分析し、具体的なコード例を示します。 1. Take メソッド Laravel では、take メソッドは返されるレコードの数を制限するために使用され、通常は orderBy メソッドと組み合わせられます。

PHP 致命的エラーの解決策: 未定義関数 mysqli_connect() の呼び出し PHP 致命的エラーの解決策: 未定義関数 mysqli_connect() の呼び出し Jun 23, 2023 am 09:40 AM

PHP を使用して Web アプリケーションを作成する場合、データの保存に MySQL データベースがよく使用されます。 PHP は、MySQLi と呼ばれる MySQL データベースと対話する方法を提供します。ただし、MySQLi を使用している場合、以下に示すようなエラー メッセージが表示されることがあります。 PPHPFatalerror:Calltounknownfunctionmysqli_connect() このエラー メッセージは、PHP が MySQLi を見つけられないことを意味します。

PHP 警告の解決方法: fopen(): ストリームを開けませんでした: そのようなファイルまたはディレクトリはありません PHP 警告の解決方法: fopen(): ストリームを開けませんでした: そのようなファイルまたはディレクトリはありません Aug 19, 2023 am 10:44 AM

PHPWarning:fopen():failedtoopenstream:No suchfileordirectory PHP 開発を使用する過程で、ファイル操作の問題がよく発生します。その 1 つが「PHPWarning:fopen():failedtoopenstream:No suchfileordirectory」です。

See all articles