>  기사  >  백엔드 개발  >  php - PCRE 정규식 주석 및 재귀 모드

php - PCRE 정규식 주석 및 재귀 모드

伊谢尔伦
伊谢尔伦원래의
2016-11-21 17:10:401212검색

댓글

문자 시퀀스(?# 태그는 닫는 대괄호를 만날 때까지 댓글을 시작합니다. 중첩된 대괄호는 허용되지 않습니다. 댓글의 문자는 패턴의 일부로 일치되지 않습니다.

PCRE_EXTENDED 옵션이 설정된 경우 문자 클래스 외부의 이스케이프 처리되지 않은 # 문자는 줄의 나머지 부분이 주석임을 나타냅니다.

재귀 모드

는 괄호 안의 일치하는 문자를 고려합니다. 문자열의 문제점은 괄호의 무한 중첩을 허용한다는 것입니다. 재귀를 사용하지 않는 경우 가장 좋은 방법은 고정된 중첩 깊이와 일치하는 패턴을 사용하는 것입니다. Perl 5.6은 정규 중첩을 허용하는 실험적 기능을 제공합니다. 특수 항목(?R)은 재귀의 특별한 사용을 제공합니다. 이 PCRE 모드는 괄호 문제를 해결합니다(PCRE_EXTENDED 옵션이 설정되어 공백 문자가 무시된다고 가정): ( ((?>[^ ()]+) | (?R) )* ).

먼저 여는 대괄호와 일치합니다. 그런 다음 대괄호가 아닌 문자 시퀀스 또는 패턴 자체의 재귀 일치(예: 올바른 대괄호 하위 문자열)와 일치합니다. 궁극적으로 닫는 괄호 일치

이 예제 패턴에는 무한 반복 중첩이 포함되어 있으므로 일회성 하위 그룹을 사용하여 괄호가 아닌 문자를 일치시키는 데, 이는 패턴이 일치하지 않는 문자에 적용됩니다. 예를 들어, (aaaaaaaaaaaaaaaaaaaaaaaaaaa()에 적용하면 "일치 없음" 결과가 빠르게 생성됩니다. 그러나 일회성 하위 그룹을 사용하지 않으면 이 일치는 시간이 오래 걸립니다. 여러 가지 방법으로 + 및 * 반복 한정자가 대상 문자열을 분리하고 실패가 보고되기 전에 모든 경로를 테스트해야 합니다.

모든 캡처 하위 그룹이 궁극적으로 설정되는 캡처 값은 재귀적 가장 바깥쪽 하위 패턴에서 캡처된 값입니다. . 위 패턴이 (ab(cd)ef)와 일치하면 캡처 하위 그룹은 최종적으로 최상위 수준에서 얻은 마지막 값인 "ef" 값으로 설정됩니다. ( ( ( (?>) ;[^ ()]+) | (?R) )* ) ), 캡처된 문자열은 패턴에 15개 이상의 캡처 브래킷이 있는 경우 최상위 브래킷 "ab(cd)ef"와 일치합니다. PCRE는 재귀 중에 실패합니다. pcre_malloc을 사용하여 데이터를 저장하기 위한 추가 메모리를 할당한 다음 pcre_free로 메모리를 해제합니다. 메모리를 할당할 수 없으면 처음 15개의 캡처 브래킷만 저장되며 내부에서 메모리 부족 오류가 발생하지 않습니다. 🎜>PHP 4.3.3부터는 (?1), (?2) 등을 재귀 하위 그룹에 사용할 수 있습니다. (?P>name) 또는 (?P&name). )

재귀 하위 그룹 구문이 참조하는 하위 그룹 대괄호 외부에서 사용되는 경우(하위 그룹 번호 또는 하위 그룹 이름) 이 작업은 프로그래밍 언어의 하위 루틴과 동일합니다. 이전 예 중 하나에서는 패턴 (sens|respons)e 및 1ibility가 "의미와 책임" 및 "응답 및 책임"과 일치하지만 "의미와 책임"과 일치하지 않는다고 명시합니다. 대신 (sens|respons)e 및 (?1)ibility 패턴을 사용하면 이 두 문자열처럼 "sense and responsibility"와 일치합니다. 이 참조 방법의 의미는 참조의 하위 패턴을 즉시 일치시키는 것입니다. (주석: 역방향 참조는 참조된 하위 그룹의 이전 일치 결과에만 일치합니다. 여기서 재귀 구문 참조는 참조된 하위 패턴을 다시 일치시키는 것입니다.)

대상 문자열의 최대 길이는 int 유형 변수이며, 가장 큰 양의 정수를 저장했습니다. 그러나 PCRE는 재귀를 사용하여 하위 그룹과 무한 반복을 처리합니다. 이는 일부 모드의 경우 사용 가능한 스택 공간이 대상 문자열에 의해 제한될 수 있음을 의미합니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.