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

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 までご連絡ください。
PHP Fatal error: Call to undefined method PDO::prepare() in的解决方法PHP Fatal error: Call to undefined method PDO::prepare() in的解决方法Jun 22, 2023 pm 06:40 PM

PHP作为一种流行的Web开发语言,已经被使用了很长时间。PHP中集成的PDO(PHP数据对象)类是我们在开发Web应用程序过程中与数据库进行交互的一种常用方法。但是,一些PHP开发者经常遇到的问题是,当使用PDO类与数据库进行交互时,他们会收到这样的错误:PHPFatalerror:CalltoundefinedmethodPDO::prep

解决C++代码中出现的“error: incomplete type is not allowed”问题解决C++代码中出现的“error: incomplete type is not allowed”问题Aug 26, 2023 pm 08:54 PM

解决C++代码中出现的“error:incompletetypeisnotallowed”问题在C++的编程过程中,有时候会遇到一些编译错误,其中一个常见的错误是“error:incompletetypeisnotallowed”。这个错误通常是由于在使用不完整的类型进行操作时引起的。本文将介绍这个错误的原因,并提供几种解决方法。首先,我

在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是一种基于Promise的HTTP客户端,可以用于浏览器和Node.js。在开发过程中,有时会出现“Uncaught(inpromise)Error:Requestfailedwithstatuscode500”的错误提示,对于开发者来说,这个错误提示可能有些难以理解和解决。本文将会探讨这

0271:real time clock error开不开机怎么办0271:real time clock error开不开机怎么办Mar 13, 2023 am 11:30 AM

“0271:real time clock error”开不开机的解决办法:1、按一下F1,在出现的界面中,将选项栏转到第三项“Date/Time”;2、将系统时间手动修改成现在的时间;3、按F10,在弹出的对话框中,选择yes;4、重新打开笔记本即可正常开机。

解决C++代码中出现的“error: expected initializer before 'datatype'”问题解决C++代码中出现的“error: expected initializer before 'datatype'”问题Aug 25, 2023 pm 01:24 PM

解决C++代码中出现的“error:expectedinitializerbefore'datatype'”问题在C++编程中,有时候我们在编写代码时会遇到一些编译错误,其中一种常见的错误是“error:expectedinitializerbefore'datatype'”。这个错误通常在变量声明或函数定义中发生,可能导致程序无法正确编译或

如何解决PHP Warning: fopen(): failed to open stream: No such file or directory如何解决PHP Warning: fopen(): failed to open stream: No such file or directoryAug 19, 2023 am 10:44 AM

如何解决PHPWarning:fopen():failedtoopenstream:Nosuchfileordirectory在使用PHP开发过程中,我们经常会遇到一些文件操作的问题,其中之一就是"PHPWarning:fopen():failedtoopenstream:Nosuchfileordirectory

PHP Fatal error: Call to undefined function mysqli_connect()的解决方法PHP Fatal error: Call to undefined function mysqli_connect()的解决方法Jun 23, 2023 am 09:40 AM

在使用PHP编写Web应用程序时,经常会使用MySQL数据库来存储数据。PHP提供了一种与MySQL数据库进行交互的方法,称为MySQLi。然而,有时在使用MySQLi时,会遇到一个错误信息,如以下所示:PHPFatalerror:Calltoundefinedfunctionmysqli_connect()这个错误信息意味着PHP无法找到my

Laravel中take和limit的使用方法详解Laravel中take和limit的使用方法详解Mar 10, 2024 pm 05:51 PM

《Laravel中take和limit的使用方法详解》在Laravel中,take和limit是两个常用的方法,用于在数据库查询中限制返回的记录数。虽然它们的作用类似,但在具体的使用场景中有一些细微的区别。本文将详细解析这两个方法的用法,并提供具体的代码示例。一、take方法在Laravel中,take方法用于限制返回的记录数,通常结合orderBy方法一起

See all articles

ホット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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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