PHP 정규식
정규식 - 구문
정규식(정규식)은 문자열 일치 패턴을 설명하는 문자열인지 여부를 확인하는 데 사용됩니다. 문자열에 특정 하위 문자열이 포함되어 있거나, 일치하는 하위 문자열을 바꾸거나, 문자열에서 특정 조건을 충족하는 하위 문자열을 추출하는 등의 작업을 수행합니다.
디렉토리를 나열할 때 dir *.txt 또는 ls *.txt의 *.txt는 정규식이 아닙니다. 여기서 *의 의미는 정규식의 *와 다르기 때문입니다.
정규식을 구성하는 것은 수학 표현식을 만드는 것과 같습니다. 즉, 작은 표현식을 함께 결합하여 다양한 메타 문자와 연산자를 사용하여 더 큰 표현식을 만들 수 있습니다. 정규식의 구성 요소는 단일 문자, 문자 모음, 문자 범위, 문자 간 선택 또는 이러한 구성 요소 모두의 조합일 수 있습니다.
정규 표현식은 일반 문자(예: a~z 문자)와 특수 문자("메타 문자"라고 함)로 구성된 리터럴 패턴입니다. 패턴은 텍스트를 검색할 때 일치시킬 하나 이상의 문자열을 설명합니다. 정규식은 검색된 문자열과 문자 패턴을 일치시키는 템플릿 역할을 합니다.
일반 문자
일반 문자에는 메타 문자로 명시적으로 지정되지 않은 인쇄 가능한 문자와 인쇄 불가능한 문자가 모두 포함됩니다. 여기에는 모든 대문자와 소문자, 모든 숫자, 모든 구두점 및 일부 기타 기호가 포함됩니다.
인쇄되지 않는 문자
인쇄되지 않는 문자도 정규식의 일부가 될 수 있습니다. 다음 표에는 인쇄되지 않는 문자를 나타내는 이스케이프 시퀀스가 나열되어 있습니다.
특수 문자
so- 특수 문자라고 불리는 것은 위에서 언급한 "*.txt"의 *와 같이 특별한 의미를 지닌 문자입니다. 간단히 말해 문자열의 의미를 나타냅니다. 파일 이름에 *가 있는 파일을 찾으려면 *를 이스케이프 처리해야 합니다. 즉, 앞에 *를 추가해야 합니다. ls*.txt.
많은 메타 문자를 일치시키려면 특별한 처리가 필요합니다. 이러한 특수 문자를 일치시키려면 먼저 문자를 "이스케이프"해야 합니다. 즉, 문자 앞에 백슬래시 문자()를 와야 합니다. 다음 표에는 정규 표현식의 특수 문자가 나열되어 있습니다.
한정자
한정자는 정규식의 특정 구성 요소가 일치 항목을 충족하기 위해 나타나야 하는 횟수를 지정하는 데 사용됩니다. 6가지 유형이 있습니다: *, +, ?, {n}, {n,} 또는 {n,m}.
정규식 한정자는 다음과 같습니다.
큰 입력 문서에서는 장 번호가 9를 초과할 가능성이 높으므로 2~3개를 처리할 방법이 필요합니다. -숫자 장 번호. 예선전은 이 능력을 제공합니다. 다음 정규 표현식은 임의의 자릿수로 번호가 매겨진 장 제목과 일치합니다.
/Chapter [1-9][0-9]*/
한정자는 장 제목 뒤에 나타납니다. 범위 표현. 따라서 전체 범위 표현에 적용됩니다. 이 경우 0부터 9까지의 숫자만 적용됩니다.
여기서는 두 번째 이후 위치에 반드시 숫자가 올 필요는 없기 때문에 + 한정자를 사용하지 않습니다. 그것도 안쓰나요? 장 번호를 두 자리로 제한하기 때문입니다. 장 뒤에 숫자 하나 이상과 공백 문자가 일치해야 합니다.
장 번호가 99장으로 제한되어 있다는 것을 알고 있는 경우 다음 표현식을 사용하여 최소 1자리, 최대 2자리를 지정할 수 있습니다.
/Chapter [0-9]{1,2}/
위 표현식의 단점은 99보다 큰 장 번호가 여전히 처음 두 자리에만 일치한다는 것입니다. 또 다른 단점은 챕터 0도 일치한다는 것입니다. 두 자리 숫자만 일치시키는 더 나은 표현은 다음과 같습니다:
/Chapter [1-9][0-9]?/
또는
/ Chapter [ 1-9][0-9]{0,1}/
*, + 및 ? 한정자는 가능한 한 많은 리터럴과 일치하므로 ?를 추가할 수 있는 경우에만 가능합니다. 탐욕스럽지 않거나 최소한의 일치를 달성합니다.
예를 들어 HTML 문서에서 H1 태그로 묶인 장 제목을 검색할 수 있습니다. 문서의 텍스트는 다음과 같습니다.
<H1>1장 – 정규 표현식 소개</H1>
다음 표현식은 보다 작음 기호( < ;)와 H1 태그를 닫는 보다 큼 기호(>) 사이의 모든 것.
/<.*>/
여는 H1 태그만 일치시키면 되는 경우 다음 "non-greedy" 표현식은 <H1>만 일치합니다.
/<.*?>/
*, + 또는 ? 한정자 뒤에 ?를 추가하면 표현식이 "탐욕스러운" 표현식에서 "non"으로 변환됩니다. -greedy" 표현 Greedy" 표현 또는 최소 일치.
탐색기
로케이터를 사용하면 정규식을 줄의 시작이나 끝 부분에 고정할 수 있습니다. 또한 단어 내, 단어 시작 부분 또는 단어 끝 부분에 나타나는 정규식을 생성할 수도 있습니다.
위치 지정자는 문자열이나 단어의 경계를 설명하는 데 사용되며, ^와 $는 각각 문자열의 시작과 끝을 나타내고, b는 단어의 앞이나 뒤 경계를 나타내며, B는 비단어 경계.
정규식 한정자는 다음과 같습니다.
참고: 한정자는 앵커 포인트와 함께 사용할 수 없습니다. 개행이나 단어 경계 바로 앞이나 뒤에는 두 개 이상의 위치가 있을 수 없으므로 ^*와 같은 표현은 허용되지 않습니다.
텍스트 줄 시작 부분의 텍스트를 일치시키려면 정규 표현식 시작 부분에 ^ 문자를 사용하세요. ^의 사용과 대괄호 표현식 내부의 사용을 혼동하지 마십시오.
텍스트 줄 끝의 텍스트를 일치시키려면 정규 표현식 끝에 $ 문자를 사용하세요.
장 제목을 검색할 때 앵커 포인트를 사용하기 위해 다음 정규식은 후행 숫자 두 개만 포함하고 줄 시작 부분에 나타나는 장 제목과 일치합니다.
/^ Chapter [1 -9][0-9]{0,1}/
실제 장 제목이 줄 시작 부분에 나타날 뿐만 아니라 줄의 유일한 텍스트이기도 합니다. 줄의 시작 부분과 같은 줄의 끝 부분에 모두 나타납니다. 다음 표현식은 지정된 일치 항목이 상호 참조가 아닌 장과만 일치하는지 확인합니다. 텍스트 줄의 시작과 끝만 일치하는 정규식을 만들어 이를 수행할 수 있습니다.
/^Chapter [1-9][0-9]{0,1}$/
은 단어 경계와 약간 다르게 일치하지만 정규 표현식에 중요한 기능을 많이 추가합니다. . 단어 경계는 단어와 공백 사이의 위치입니다. 단어가 아닌 경계는 다른 위치입니다. 다음 표현식은 Chapter라는 단어의 처음 세 문자와 일치합니다. 왜냐하면 이 세 문자는 단어 경계 뒤에 나타나기 때문입니다.
/bCha/
b 문자의 위치는 매우 중요합니다. 일치할 문자열의 시작 부분에 있는 경우 단어의 시작 부분에서 일치 항목을 찾습니다. 문자열 끝에 있으면 단어 끝에서 일치하는 항목을 찾습니다. 예를 들어, 다음 표현식은 단어 경계 앞에 나타나는 Chapter라는 단어의 문자열 ter와 일치합니다.
/terb/
다음 표현식은 Chapter의 문자열과 일치합니다. apt이지만 aptitude의 문자열 apt와 일치하지 않습니다:
/Bapt/
문자열 apt는 단어 Chapter의 단어가 아닌 경계에서 발생하지만 다음 위치에서는 발생하지 않습니다. 단어 경계 적성의 단어 경계에 있습니다. B 비단어 경계 연산자의 경우 일치 항목이 단어의 시작인지 끝인지 상관하지 않으므로 위치는 중요하지 않습니다.
선택
모든 선택 항목을 괄호로 묶고 인접한 선택 항목은 |로 구분합니다. 그러나 괄호를 사용하면 부작용이 발생합니다. 즉, 관련 일치 항목이 캐시됩니다. 이 경우 첫 번째 옵션 앞에 ?:를 사용하면 이 부작용을 제거할 수 있습니다.
그 중 ?: 는 비캡처 요소 중 하나이고, 나머지 두 비캡처 요소는 ?= 및 ?! 입니다. 이 둘은 전방 조회이며 일치하기 시작합니다. 정규식 패턴은 정규식 패턴과 일치하지 않는 모든 위치의 검색 문자열과 일치합니다. 후자는 정규식 패턴과 일치하지 않는 모든 초기 위치의 검색 문자열과 일치하는 부정 예측입니다.
역참조
정규식 패턴이나 패턴의 일부 주위에 괄호를 추가하면 관련 일치 항목이 임시 버퍼에 저장되고 각 하위 일치 항목은 정규식 패턴에 지정된 대로 캡처됩니다. 표현식은 왼쪽에서 오른쪽으로 나타나는 순서대로 저장됩니다. 버퍼 번호는 1부터 시작하며 최대 99개의 캡처된 하위 표현식을 저장할 수 있습니다. 각 버퍼는 'n'을 사용하여 액세스할 수 있습니다. 여기서 n은 특정 버퍼를 식별하는 한 자리 또는 두 자리 십진수입니다.
비캡처 메타문자 '?:', '?=' 또는 '?!'를 사용하여 캡처를 재정의할 수 있으며 관련 일치 항목 저장을 무시합니다.
역참조의 가장 간단하고 유용한 응용 프로그램 중 하나는 텍스트에서 인접한 두 개의 동일한 단어의 일치 항목을 찾는 기능입니다. 다음 문장을 예로 들어 보겠습니다.
휘발유 가격이 올라가나요?
위 문장에는 분명히 여러 단어가 반복됩니다. 각 단어의 반복을 찾을 필요 없이 이 문장을 찾는 방법을 고안하는 것이 좋을 것입니다. 다음 정규 표현식은 이를 달성하기 위해 단일 하위 표현식을 사용합니다.
/b([a-z]+) 1b/gi
는 다음을 포함하여 [a-z] + Specified와 같은 표현식을 캡처합니다. 하나 이상의 문자. 정규 표현식의 두 번째 부분은 이전에 캡처된 부분 일치에 대한 참조입니다. 즉, 대괄호 표현식과 정확히 일치하는 단어의 두 번째 발생입니다. 1은 첫 번째 부분 일치를 지정합니다. 단어 경계 메타 문자는 전체 단어만 감지되도록 합니다. 그렇지 않으면 "발행됨" 또는 "이것은"과 같은 문구가 이 표현으로 올바르게 인식되지 않습니다.
정규 표현식 뒤의 전역 태그(g)는 입력 문자열에서 찾을 수 있는 최대 일치 항목에 표현식이 적용되도록 지시합니다. 표현식 끝에 있는 대소문자를 구분하지 않는(i) 태그는 대소문자를 구분하지 않음을 지정합니다. 여러 줄 태그는 개행 문자의 양쪽에서 발생할 수 있는 잠재적 일치 항목을 지정합니다.
또한 역참조는 URI(Universal Resource Indicator)를 해당 구성 요소로 분류합니다. 다음 URI를 프로토콜(ftp, http 등), 도메인 주소 및 페이지/경로로 나누고 싶다고 가정해 보겠습니다.
http://www.php.cn:80/html/html-tutorial. html
다음 정규식은 이 기능을 제공합니다.
/(w+)://([^/:]+)(:d*)?([^# ] *)/
첫 번째 대괄호 하위 표현식은 웹 주소의 프로토콜 부분을 캡처합니다. 이 하위 표현식은 앞에 콜론과 두 개의 슬래시가 오는 모든 단어와 일치합니다. 두 번째 괄호 하위 표현식은 주소의 도메인 주소 부분을 캡처합니다. 하위 표현식은 / 및 :를 제외한 하나 이상의 문자와 일치합니다. 세 번째 괄호 하위 표현식은 포트 번호(지정된 경우)를 캡처합니다. 이 하위 표현식은 콜론 다음에 오는 0개 이상의 숫자와 일치합니다. 이 하위 표현식은 한 번만 반복될 수 있습니다. 마지막으로 네 번째 대괄호 하위 표현식은 웹 주소로 지정된 경로 및/또는 페이지 정보를 캡처합니다. 이 하위 표현식은 # 또는 공백 문자를 포함하지 않는 모든 문자 시퀀스와 일치합니다.
위의 URI에 정규식을 적용하면 각 하위 일치에는 다음이 포함됩니다.
괄호로 묶인 첫 번째 하위 표현식에는 "http"가 포함됩니다.
두 번째에는 첫 번째 대괄호 하위 표현식에 "www가 포함됩니다. .php.cn"
세 번째 대괄호 하위 표현식에는 ":80"이 포함되어 있습니다.
네 번째 대괄호 하위 표현식에는 "../html /html-tutorial.html"이 포함되어 있습니다
더 많은 정규식 지식은 http://php.cn/regexp/regexp-tutorial.html
더 많은 정규식을 참조하세요. 공식의 예는 http://www.cnblogs를 참조하세요. .com/diony/archive/2010/12/16/1908499.html