PHP 정규 표현식의 패턴 수정자
메타문자와 Atom을 통해 정규식 표현 입문을 마쳤습니다. 우리가 아직 처리해야 할 몇 가지 특별한 상황이 있습니다.
abc가 두 번째 줄의 시작 부분에 있으면 어떻게 매칭하나요?
정규식이 특별히 모두 일치하는 것을 원하지 않습니다. 일부만 일치하는 경우 어떻게 해야 합니까?
이때 정규 기능을 향상시키기 위해서는 다음과 같은 패턴 매칭을 사용해야 합니다.
일반적으로 사용되는 패턴 일치 문자는 다음과 같습니다.
模式匹配符 | 功能 |
---|---|
i | 模式中的字符将同时匹配大小写字母. |
m | 字符串视为多行 |
s | 将字符串视为单行,换行符作为普通字符. |
x | 将模式中的空白忽略. |
A | 强制仅从目标字符串的开头开始匹配. |
D | 模式中的美元元字符仅匹配目标字符串的结尾. |
U | 匹配最近的字符串. |
패턴 일치 문자의 사용법은 다음과 같습니다.
/ 정규식 표현식/패턴 일치 문자
패턴 일치 문자는 패턴 일치 문자의 끝에 배치됩니다. 이 문장. 예:
/w+/s
다음으로 가장 중요한 것은 패턴 일치 문자 사용에 대한 이해와 기억을 강화하는 것입니다. . 패턴 일치 항목을 추가하는 것과 추가하지 않는 것의 차이점을 이해하기 위해 코드를 사용합니다.
i는 대소문자를 구분하지 않습니다
<?php //在后面加上了一个i $pattern = '/ABC/i'; $string = '8988abc12313'; $string1 = '11111ABC2222'; if(preg_match($pattern, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>
결론적으로 $string과 $string1 모두 성공적으로 일치했습니다. 따라서 마지막에 i를 추가한 후 내용이 일치하는 경우는 무시할 수 있다.
m은 여러 줄로 처리됩니다.
정규식으로 매칭할 때 매칭 대상 문자열은 보통 한 줄로 처리됩니다.
"줄 시작" 메타 문자(^)는 문자열의 시작 부분에만 일치하고 "줄 끝" 메타 문자($)는 문자열 끝 부분에만 일치합니다.
이 수정자를 설정하면 "줄 시작"과 "줄 끝"은 전체 문자열의 시작과 끝과 일치할 뿐만 아니라 각각 줄바꿈 문자 뒤와 앞도 일치합니다.
참고: 일치시킬 문자열에 "n" 문자가 없거나 패턴에 ^ 또는 $가 없는 경우 이 수정자를 설정해도 효과가 없습니다.
실험과 코드를 통해 이 기능을 검증해 보겠습니다.
첫 번째 일치의 경우 일치가 실패했음을 알 수 있습니다.
<?php $pattern = '/^a\d+/'; $string = "我的未来在自己手中我需要不断的努力 a9是一个不错的字符表示 怎么办呢,其实需要不断奋进"; if (preg_match($pattern, $string, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
두 번째 일치의 경우, m을 추가해 보겠습니다:
<?php $pattern = '/^a\d+/m'; $string = "我的未来在自己手中我需要不断的努力 a9是一个不错的字符表示 怎么办呢,其实需要不断奋进"; if (preg_match($pattern, $string, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
결과:
아 그렇군요! 경기는 성공적이었습니다. /^ad+/ 일치하는 콘텐츠는 a9이며 줄의 시작 부분에 있어야 합니다. 두 번째 줄도 성공적으로 일치했습니다.
은 한 줄로 인식됩니다
이 수정자를 설정하면 패턴의 점 메타 문자(.)가 다음을 포함한 모든 문자와 일치합니다. 개행.
처음에는 패턴 일치 문자 s가 추가되지 않았습니다.
<?php $pattern = '/新的未来.+\d+/'; $string = '新的未来 987654321'; if (preg_match($pattern, $string, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
두 번째에는 패턴 일치 문자 s가 정규 표현식 뒤에 추가되었습니다.
<?php $pattern = '/新的未来.+\d+/s'; $string = "新的未来 987654321"; if (preg_match($pattern, $string, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
결과 다음과 같습니다. 매치 성공!
결론 :
1. 새로운 미래에는 미래 뒤에 줄바꿈이 있기 때문이다
2. 그리고 (point ) is 공백이 아닌 문자를 제외한 모든 문자와 일치합니다. 그래서 1차는 실패했습니다
3. 2차에는 s 패턴매처가 추가되었습니다. .(점)을 추가하면 모든 문자와 일치할 수 있기 때문입니다.
x 공백 문자 무시
1. 이 수정자가 설정되면 패턴의 모든 공백 문자는 이스케이프되거나 문자 클래스에 있는 문자를 제외합니다.
2. 이스케이프되지 않은 문자 클래스 외부의 # 문자와 다음 개행 문자 사이의 문자도 무시됩니다.
빈 줄 무시와 같은 기능을 먼저 실험해 보겠습니다.
<?php $pattern = '/a b c /x'; $string = '学英语要从abc开始'; if (preg_match($pattern, $string, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
이것도 성공적으로 일치할 수 있습니다.
$패턴에는 공백이 있고, 각 abc 뒤에도 공백이 있습니다. $string에는 공백이 없습니다.
그래서 x는 공백 문자를 무시합니다.
두 번째 문장은 문자 그대로 이해하기가 더 어려운데요,
rree결과도 성공적인 매치!
x의 두 번째 특성은 무시된다는 점을 발견했습니다. 즉, # 문자와 다음 개행 문자 사이의 문자도 무시됩니다.
e 일치하는 항목을 찾아 교체합니다.
e 패턴을 역참조라고도 합니다. 주요 기능은 정규식 괄호 안의 내용을 꺼내어 대체 항목에 넣어 원래 문자열을 바꾸는 것입니다.
이 패턴 일치자를 사용하기 전에 Preg_replace()를 사용해야 합니다.
혼합 preg_replace(혼합 $regular 일치, 혼합 $replacement, 혼합 $search 문자열)
의 기능 preg_replace: $regular 일치 항목을 사용하여 $search 문자열 변수를 찾습니다. 그런 다음 $replacement 변수를 사용하여 교체합니다.
정식적인 설명에 앞서, 사전 지식을 복습해 보겠습니다. 일치할 각 원자 주위에 일부러 괄호를 넣었습니다.
<?php //重点观察这一行 $pattern = '/a b c #我来写一个注释 /x'; $string = '学英语要从abc开始'; if (preg_match($pattern, $string, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
살펴보겠습니다. 결과:
이전에 대괄호에 대해 이야기한 적이 있습니다. 일치하는 콘텐츠 밖에 대괄호가 있습니다. 대괄호 안의 내용도 배열 요소에 배치됩니다. 그림에 표시된 대로: 987, abc, 321.
정규 표현식의 e 패턴을 살펴보겠습니다.
<?php //加上了括号 $pattern = '/(\d+)([a-z]+)(\d+)/'; $string = '987abc321'; if (preg_match($pattern, $string, $match)) { echo '匹配到了,结果为:'; var_dump($match); } else { echo '没有匹配到'; } ?>
실행 결과를 살펴보겠습니다.
결론:
위의 예에서 $2는 정규 표현식이 나타내는 첫 번째(d+)를 가리킵니다. 다시 15개를 빼는 것과 같습니다
교체할 때 2달러를 씁니다. 일치하는 항목을 꺼내서 다시 일치 결과를 교체하는 데 사용하십시오.
U Greedy 모드 제어
정규 표현식은 기본적으로 Greedy, 즉 최대한 일치합니다.
정규식이 얼마나 탐욕스러운지 살펴보겠습니다.
<?php $string = "{April 15, 2003}"; //'w'匹配字母,数字和下划线,'d'匹配0-99数字,'+'元字符规定其前导字符必须在目标对象中连续出现一次或多次 $pattern = "/{(\w+) (\d+), (\d+)}/i"; $replacement = "$2"; //字符串被替换为与第 n 个被捕获的括号内的子模式所匹配的文本 echo preg_replace($pattern, $replacement, $string); ?>
결과를 살펴보고 다음과 같은 결론을 얻겠습니다. "
Hello"에서 "I am
"까지 직접 일치합니다. 최대 일치가 이루어졌습니다.
동일한 코드에 대문자 U를 추가하고 효과를 살펴보겠습니다.
<?php $pattern = '/<div>.*<\/div>/'; $string = "<div>你好</div><div>我是</div>"; if (preg_match($pattern, $string, $match)) { echo '匹配到了,结果为:'; var_dump($match); } else { echo '没有匹配到'; } ?>
일치하는 항목만 나온 것을 확인했습니다.
<?php $pattern = '/<div>.*<\/div>/U'; $string = "<div>你好</div><div>我是</div>"; if (preg_match($pattern, $string, $match)) { echo '匹配到了,结果为:'; var_dump($match); } else { echo '没有匹配到'; } ?>
이렇게 규칙성의 탐욕스러운 특성을 취소합니다. 가장 가까운 일치 항목을 찾으면 괜찮습니다.
A는 대상 문자열의 시작 부분부터
와 일치합니다. 이 패턴은 메타 문자의 ^(곡절) 효과와 유사합니다.
<div>你好</div>
결론:
1. A 모드 수식어 추가 시 $string이 일치하지 않으면 추가하지 않고도 일치 가능
2. A가 추가되는 경우 언제 패턴 수정자를 사용하면 $string1은 처음부터 일치를 시작해야 하기 때문에 일치할 수 있습니다
D 끝 이후에는 캐리지 리턴이 없습니다
.이 수정자를 설정하면 패턴의 달러 메타 문자는 대상 문자열의 끝과만 일치합니다. 이 옵션이 없으면 달러 기호는 개행 문자인 경우 마지막 문자 앞에서도 일치합니다.
<?php $pattern = '/this/A'; $string = 'hello this is a '; //$string1 = 'this is a '; if (preg_match($pattern, $string, $match)) { echo '匹配到了,结果为:'; var_dump($match); } else { echo '没有匹配到'; } ?>
결론:
1. 예를 들어 패턴이 $string과 일치하면 $string의 this 문자열 뒤에 캐리지 리턴이 있습니다. D 일치 문자
를 추가하지 않고도 성공적으로 일치할 수도 있습니다. 2. 예를 들어 패턴이 $string과 일치하면 D가 추가됩니다. $string에서 this 문자열 뒤에 공백이 있어 일치가 실패합니다.