기본 PHP 개발 튜토리얼: 정규식의 패턴 수정자
1. 문제 소개
메타문자와 Atom을 통해 정규식 표현 입문을 마쳤습니다. 우리가 아직 처리해야 할 몇 가지 특별한 상황이 있습니다.
abc가 두 번째 줄의 시작 부분에 있으면 어떻게 일치시키나요?
정규식이 특별히 모두 일치하는 것을 원하지 않습니다. 일부만 일치하는 경우 어떻게 해야 합니까?
이때 정규 기능을 향상시키기 위해서는 다음과 같은 패턴 매칭을 사용해야 합니다.
일반적으로 사용되는 패턴 일치 문자는 다음과 같습니다.
패턴 일치 문자의 사용법은 다음과 같습니다.
/ 정규 표현식 표현/패턴 패턴 일치 기호
는 이 문장의 끝에 배치됩니다. 예:
/w+/s
다음으로 가장 중요한 것은 패턴 일치 문자 사용에 대한 이해와 기억을 강화하는 것입니다. . 패턴 일치 문자를 추가하는 것과 추가하지 않는 것의 차이를 이해하기 위해 코드를 사용합니다
2. 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를 추가하면 일치하는 내용의 경우를 구분할 수 있습니다
3. 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이며 줄의 시작 부분에 있어야 합니다. 두 번째 줄도 성공적으로 일치했습니다.
4.s는 한 줄로 처리됩니다
이 수정자를 설정하면 패턴의 점 메타 문자(.)가 모든 문자와 일치합니다. , 개행 문자 포함.
처음에는 패턴 일치 문자 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. 그리고 .(점)은 공백이 아닌 문자를 제외한 모든 문자와 일치합니다. 그래서 1차는 실패했습니다
3. 2차에는 s 패턴매처가 추가되었습니다. .(점)을 추가하면 모든 문자와 일치할 수 있기 때문입니다.
5. x는 공백 문자를 무시합니다
1. 이 수정자를 설정하면 이스케이프되거나 문자 클래스 내의 공백 문자를 제외하고 패턴의 공백 문자가 완전히 무시됩니다.
2. 이스케이프되지 않은 문자 클래스 외부의 # 문자와 다음 개행 문자 사이의 문자도 무시됩니다.
빈 줄 무시와 같은 기능을 먼저 실험해 보겠습니다.
<?php $pattern = '/a b c /x'; $string = '学英语要从abc开始'; if (preg_match($pattern, $string, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
이것은 또한 성공적으로 일치할 수 있습니다.
$pattern에는 공백이 있고, 각 abc 뒤에도 공백이 있습니다. $string에는 공백이 없습니다.
그래서 x는 공백 문자를 무시합니다.
두 번째 문장은 문자 그대로 이해하기가 더 어려운데요,
rree결과도 성공적인 매치!
결론: x의 두 번째 특성은 무시된다는 점을 발견했습니다. # 문자와 다음 개행 문자 사이의 문자도 무시됩니다.
6. e 일치하는 항목을 찾아서 교체
e 모드를 역참조라고도 합니다. . 주요 기능은 정규식 괄호 안의 내용을 꺼내어 대체 항목에 넣어 원래 문자열을 바꾸는 것입니다.
이 패턴 일치자를 사용하기 전에 Preg_replace()를 사용해야 합니다.
혼합 preg_replace(혼합 $regular 일치, 혼합 $replacement, 혼합 $search 문자열)
preg_replace 기능: $ 사용 일반 변경 내용을 일치시키고 $ 검색 문자열 변수를 찾습니다. 그런 다음 $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를 씁니다. 일치하는 항목을 꺼내서 다시 일치 결과를 교체하는 데 사용하십시오.
7. U 욕심 모드 제어
정규식은 기본적으로 욕심, 즉 최대한 일치시킵니다.
정규식이 얼마나 탐욕스러운지 살펴보겠습니다.
<?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 '没有匹配到'; } ?>
출력 결과를 살펴보세요.
일치하는 항목만 나온 것을 확인했습니다.
<div>안녕하세요</div>
이렇게 하면 규칙성의 탐욕스러운 특성이 취소됩니다. 가장 가까운 일치 항목을 찾으면 괜찮습니다.
8. A는 대상 문자열의 시작 부분부터
와 일치합니다. 이 패턴은 메타 문자의 ^(곡절) 효과와 유사합니다. .
<?php $pattern = '/<div>.*<\/div>/U'; $string = "<div>你好</div><div>我是</div>"; if (preg_match($pattern, $string, $match)) { echo '匹配到了,结果为:'; var_dump($match); } else { echo '没有匹配到'; } ?>
결론:
A 모드 수식자를 추가할 때 $string을 일치시킬 수 없으면 추가하지 않고도 일치할 수 있습니다.
A 모드 수식자를 추가하면 $string1은 처음부터 일치해야 하므로 일치 가능
9. D End$ 캐리지 없음
뒤에 반환이 허용됩니다. 이 수정자가 설정된 경우 패턴의 달러 메타 문자는 대상 문자열의 끝과만 일치합니다. 이 옵션이 없으면 달러 기호는 개행 문자인 경우 마지막 문자 앞에서도 일치합니다.
<?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과 일치하면 this 문자열 뒤에 반환이 있습니다. $string 자동차. D 일치 문자
2를 추가하지 않고도 성공적으로 일치할 수 있습니다. 예를 들어 패턴이 $string과 일치하면 D가 추가됩니다. $string의 this 문자열 뒤에 공백이 있어 일치가 실패합니다.