백엔드 개발 PHP 튜토리얼 php正则失灵-最大回溯(pcre.backtrack_limit)/递归限制

php正则失灵-最大回溯(pcre.backtrack_limit)/递归限制

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

php正则失效-最大回溯(pcre.backtrack_limit)/递归限制

昨天,同事在处理一个正则采集程序,发现了一个怪现象:在本地正则规则随便写都可以匹配到,可是上传到服务器后发现正则怎么写都匹配不到。自己调整了半天没有效果,放弃?那就…………,不甘心……,吃过晚饭后,打开电脑随便乱狂博客,还是google了一下,有关正则的规则,找来找去都在谈怎么写正则表达式等。最后静下心来分析了一下。

我和同事的电脑装的都是wamp,php版本都是5.3.x,服务器php版本是5.2.x,难道是这个问题,抱着怀疑的心情,打开了手册文本处理-pcre函数-preg_match_all,好家伙原来它上面有一个函数preg_last_error,打开看了看,那就用他试下我的代码,结果返回错误是   PREG_BACKTRACK_LIMIT_ERROR ,原来是这个环境变量问题,于是在我代码的开头加入ini_set("pcre.backtrack_limit",1000000);结果正常抓取。回头再看了下手册,发现下面的介绍:


最后又上网查了一些资料,其中有一个博主写的挺细的:下面转一些相关内容,解释一下:

在PHP的pcre扩展中, 提供了俩个设置项.


1 pcre.backtrack_limit //最大回溯数
2 pcre.recursion_limit //最大嵌套数


默认的backtarck_limit是100000(10万).
现在要弄清这个问题的原因, 关键就是什么是”回溯”.
这个正则, 使用非贪婪模式, 非贪婪模式匹配原理简单来说是, 在可配也可不配的情况下, 优先不匹配. 记录备选状态, 并将匹配控制交给正则表达式的下一个匹配字符, 当之后的匹配失败的时候, 再溯, 进行匹配.


举个例子:
源字符串: aaab正则: .*?
匹配过程开始的时候, “.*?”首先取得匹配控制权, 因为是非贪婪模式, 所以优先不匹配, 将匹配控制交给下一个匹配字符”b”, “b”在源字符串位置1匹配失败(“a”), 于是回溯, 将匹配控制交回给”.*?”, 这个时候, “.*?”匹配一个字符”a”, 并再次将控制权交给”b”, 如此反复, 最终得到匹配结果, 这个过程中一共发生了3次回溯.


最后,还是要说一下

1、在PHP 5.2以后, 提供了:int preg_last_error ( void )Returns the error code of the last PCRE regex execution.
我们应该经常检查这个函数的返回值, 当不为零的时候说明上一个正则函数出错, 特别的对于文章的例子, 出错返回(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 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. 크로스 플레이가 있습니까?
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP 치명적인 오류에 대한 해결 방법: 정의되지 않은 메소드 PDO::prepare() 호출 PHP 치명적인 오류에 대한 해결 방법: 정의되지 않은 메소드 PDO::prepare() 호출 Jun 22, 2023 pm 06:40 PM

PHP는 오랫동안 사용되어 온 인기 있는 웹 개발 언어입니다. PHP에 통합된 PDO(PHP 데이터 개체) 클래스는 웹 애플리케이션 개발 중에 데이터베이스와 상호 작용하는 일반적인 방법입니다. 그러나 일부 PHP 개발자가 자주 직면하는 문제는 PDO 클래스를 사용하여 데이터베이스와 상호 작용할 때 다음과 같은 오류가 발생한다는 것입니다. PHPFatalerror:CalltoundefinemethodPDO::prep

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"이라는 오류 메시지가 나타나는 경우가 있는데, 개발자 입장에서는 이 오류 메시지를 이해하고 해결하기 어려울 수 있습니다. 이 기사에서는 이에 대해 알아볼 것입니다.

C++ 코드에서 '오류: 불완전한 유형은 허용되지 않습니다' 문제 해결 C++ 코드에서 '오류: 불완전한 유형은 허용되지 않습니다' 문제 해결 Aug 26, 2023 pm 08:54 PM

C++ 코드의 "error:incompletetypeisnotallowed" 문제를 해결하십시오. C++ 프로그래밍 프로세스 중에 흔히 발생하는 오류 중 하나는 "error:incompletetypeisnotallowed"입니다. 이 오류는 일반적으로 불완전한 유형에서 작업할 때 발생합니다. 이 문서에서는 이 오류의 원인을 설명하고 몇 가지 해결 방법을 제공합니다. 첫째로, 나는

C++ 코드에서 '오류: '데이터 유형' 이전에 예상되는 초기화 프로그램' 문제 해결 C++ 코드에서 '오류: '데이터 유형' 이전에 예상되는 초기화 프로그램' 문제 해결 Aug 25, 2023 pm 01:24 PM

C++ 코드의 "error:expectedinitializerbefore'datatype'" 문제를 해결하세요. C++ 프로그래밍에서 코드를 작성할 때 가끔 컴파일 오류가 발생하는 경우가 있습니다. 일반적인 오류 중 하나는 "error:expectedinitializerbefore'datatype'"입니다. 이 오류는 일반적으로 변수 선언이나 함수 정의에서 발생하며 프로그램이 올바르게 컴파일되지 않거나

0271: 실시간 시계 오류로 인해 컴퓨터가 켜지지 않으면 어떻게 해야 하나요? 0271: 실시간 시계 오류로 인해 컴퓨터가 켜지지 않으면 어떻게 해야 하나요? Mar 13, 2023 am 11:30 AM

부팅할 수 없는 "0271: 실시간 시계 오류"에 대한 해결 방법: 1. F1을 누르고 나타나는 인터페이스에서 옵션 표시줄을 세 번째 항목 "날짜/시간"으로 이동합니다. 2. 시스템 시간을 현재 시간으로 수동으로 변경합니다. 3. F10을 누르고 팝업 대화 상자에서 예를 선택합니다. 4. 정상적으로 부팅하려면 노트북을 다시 엽니다.

Laravel에서 테이크와 리밋을 사용하는 방법에 대한 자세한 설명 Laravel에서 테이크와 리밋을 사용하는 방법에 대한 자세한 설명 Mar 10, 2024 pm 05:51 PM

"Laravel에서 take와limit를 사용하는 방법에 대한 자세한 설명" Laravel에서 take와limit는 데이터베이스 쿼리에서 반환되는 레코드 수를 제한하는 데 일반적으로 사용되는 두 가지 방법입니다. 기능은 유사하지만 특정 사용 시나리오에서는 약간의 차이가 있습니다. 이 기사에서는 이 두 가지 방법의 사용법을 자세히 분석하고 구체적인 코드 예제를 제공합니다. 1. Take 메소드 Laravel에서 take 메소드는 반환되는 레코드 수를 제한하는 데 사용되며 일반적으로 orderBy 메소드와 결합됩니다.

PHP 경고 해결 방법: fopen(): 스트림을 열지 못했습니다: 해당 파일이나 디렉터리가 없습니다. PHP 경고 해결 방법: fopen(): 스트림을 열지 못했습니다: 해당 파일이나 디렉터리가 없습니다. Aug 19, 2023 am 10:44 AM

PHPWarning:fopen():failedtoopenstream:Nosuchfileordirectory 해결 방법 PHP 개발을 사용하는 과정에서 "PHPWarning:fopen():failedtoopenstream:Nosuchfileordirectory"와 같은 파일 작업 문제가 종종 발생합니다.

PHP 치명적인 오류에 대한 해결 방법: 정의되지 않은 함수 mysqli_connect() 호출 PHP 치명적인 오류에 대한 해결 방법: 정의되지 않은 함수 mysqli_connect() 호출 Jun 23, 2023 am 09:40 AM

PHP를 사용하여 웹 애플리케이션을 작성할 때 MySQL 데이터베이스를 사용하여 데이터를 저장하는 경우가 많습니다. PHP는 MySQLi라는 MySQL 데이터베이스와 상호 작용하는 방법을 제공합니다. 그러나 때때로 MySQLi를 사용할 때 아래와 같은 오류 메시지가 표시될 수 있습니다. PHPFatalerror:Calltoundefoundfunctionmysqli_connect() 이 오류 메시지는 PHP가 내 항목을 찾을 수 없음을 의미합니다.

See all articles