기본 PHP 개발 튜토리얼: 정규식의 메타문자
1. 메타문자
새로운 요구사항: d는 일치하는 문자 하나를 나타냅니다. 그리고 이제 10개나 8개를 매칭하고 싶은데, 숫자가 여러 개 있으면 어떻게 해야 하나요?
이번에는 메타문자를 사용하겠습니다. Atom을 사용할 때 한 문자만 일치할 수 있지만 여러 문자를 일치시키면 문제가 발생한다는 것을 알았습니다.
이때 원자를 수정하고 더 많은 기능을 달성하려면 메타문자를 사용해야 합니다.
다음 사항에 겁먹지 마세요. 우리는 조금씩 실험을 해보면 모든 것을 이해할 수 있을 것입니다. 가장 중요한 것은 이것이 더 다양하다는 것입니다.
보자:
+ 앞의 문자 일치 <🎜 한 번 이상 >
<?php $zz = '/\d+/'; $string = "迪奥和奥迪250都是我最爱"; //待会儿再试试中间没有0-9的情况 //$string = "迪奥和奥迪都是我最爱"; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>d+에서 +가 증명되어 일치가 성공했습니다. d는 숫자와 일치하고 +는 이전 문자와 적어도 한 번 일치합니다.
은 앞의 문자와 0번 또는 여러 번 일치합니다.
<?php $zz = '/\w*/'; $string = "!@!@!!@#@!$@#!"; //$string1 = "!@#!@#!abcABC#@#!"; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>주석 처리된 $string1과 $string이 성공적으로 일치합니다. 왜냐하면 w는 0-9A-Za-z_와 일치하고, *는 이전 w가 존재하지 않음을 의미하기 때문입니다. 존재하는 경우 1개 이상이 있을 수 있습니다.
? 앞의 문자가 0번 또는 1번 나타납니다. 선택 사항
<?php $zz = '/ABC\d?ABC/'; $string = "ABC1ABC" //待会儿再试试中间没有0-9的情况 //$string1 = "ABC888888ABC"; //$string2 = "ABCABC"; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>$string, $string2와 일치하지만 $string1과 일치하지 않습니다.
매칭 전후에 ABC가 있고 중간에 0~9가 있기 때문에 0~9는 선택사항이지만 2개 이상 있을 수 없습니다.
.(점)은 n
<?php $zz = '/gg.+gg/'; $string = "ABC1ABC"; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>를 제외한 모든 문자와 일치합니다. 앞과 뒤가 모두 일치하기 때문입니다. 필수입니다 gg,
2. |(세로 막대) 또는 가장 낮은 우선순위
우선순위와 우선순위의 합을 실험을 통해 살펴보겠습니다. 또는 매칭<?php $zz = '/abc|bcd/'; $string1 = "abccd"; $string2 = "ggggbcd"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>살펴보자: 1. 처음에 제가 생각한 매칭은 abccd나 abbcd로 매칭하는 것이었습니다. 그러나 $string1과 $string2를 일치시키면 일치 결과는 abc와 bcd입니다. 2. 구현 또는 일치하면 일치 결과는 abc 또는 bcd입니다. 함께 연속된 문자열보다 우선순위가 높지 않습니다. 그러면 위의 예에서 abccd나 abbcd를 일치시키려면 어떻게 해야 합니까? 우선순위를 변경하려면 ()를 사용해야 합니다. 코드는 다음과 같습니다.
<?php $zz = '/ab(c|b)cd/'; $string1 = "起来abccd阅兵"; $string2 = "ggggbcd"; $string3 = '中国abbcd未来'; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>결과는 다음과 같습니다.
결론:
1. abccd 또는 abbcd($string1 또는 $string3)와 일치합니다. 2. 그런데 일치하는 배열에 요소가 하나 더 있고 이 요소의 첨자는 13. () 안의 내용이 성공적으로 일치하면 일치하는 데이터가 아래 첨자 1이 있는 배열 요소에 배치됩니다.
3. ^(circumflex), ^
<?php $zz = '/^小明\w+/'; $string1 = "小明abccdaaaasds"; //$string2小明 $string2 = "明abccdaaaasds"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
뒤의 문자열로 시작해야 합니다. 실험을 통해 다음과 같은 결론을 얻었습니다. <… . a-zA-Z0-9_1자 이상.
4. $(달러 기호)는 $
<?php
$zz = '/\d+努力$/';
$string1 = "12321124333努力";
//$string2
$string2 = "12311124112313力";
if (preg_match($zz, $string1, $matches)) {
echo '匹配到了,结果为:';
var_dump($matches);
} else {
echo '没有匹配到';
}
?>
1.$string1은 성공적으로 일치했지만 $string2는 성공적으로 일치하지 않았습니다.
2 .$ 앞의 문자는 d+이고 그 뒤에 중국어가 표시됩니다.
3. 그러므로 일치하는 것은 이 전체이다. d는 0~9의 정수를 나타내고, +부호는 0~9 중 하나 이상을 나타냄
5. b와 B의 단어 경계와 비단어 경계
경계가 무엇인지 설명해 보겠습니다.
1. 정규식에는 경계가 있습니다. 이 경계는 구분 기호의 시작과 끝이 정규 경계입니다. 2.영문어이고 그 뒤에 공백이 옵니다. 이는 단어가 끝나고 단어 경계에 도달했음을 의미합니다.
b 단어 경계, 즉 첫 번째 또는 마지막이어야 함을 의미합니다.
B는 경계가 없습니다. 즉, 정규식의 시작이나 끝에 올 수 없습니다.
<?php $zz = '/\w+\b/'; $string1 = "this is a apple"; $string2 = "thisis a apple"; $string3 = "thisisaapple"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>결론: 1.$string1, $string2 및 $string3이 모두 성공적으로 일치합니다.
- 2. $string1이 일치하면 이것이 경계입니다.
- 3. $string2가 일치하면 이것이 경계입니다. >
4. $string3이 일치하면 thisisaapple은 전체 정규 표현식의 끝에 도달하므로 경계이기도 합니다. 그래서 시합은 성공적이다.
단어가 아닌 경계를 실험해 보겠습니다.<?php $zz = '/\Bthis/'; $string1 = "hellothis9"; //$string2 = "hello this9"; //$string2 = "this9中国万岁"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>요약:
$string1과 일치하지만 $string2는 실패합니다.
B 뒤에 this가 오기 때문에 단어 경계(공백 및 시작과 끝)에는 나타날 수 없습니다.
6. {m}은 m번만 나타날 수 있습니다.
<?php $zz = '/喝\d{3}酒/'; $string1 = "喝988酒"; //$string2 = "喝98811酒"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>결론: 위의 예 d{3}에서 나는 0-9가 한 번 이상 또는 그 이하가 아닌 3번만 나타날 수 있다고 규정했습니다.
7. {n,m}은 n~m번 나타날 수 있습니다.
<?php $zz = '/喝\d{1,3}酒/'; $string1 = "喝9酒"; //$string2 = "喝988酒"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
결론: 부분 1 예제 d{1,3}에서는 0-9가 한 번, 두 번 또는 세 번만 나타날 수 있다고 규정했습니다. 그 외 시간은 모두 틀립니다
8.{m,} 최소 m회, 최대 횟수 제한은 없습니다
<?php $zz = '/喝\d{2,}/'; $string1 = "喝9"; //$string2 = "喝98"; //$string3 = "喝98122121"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
결론:
위 예시에서는 d{2,}와 다음 0~9가 최소 2번 이상 등장한다고 규정하고, 최대 횟수에는 제한이 없습니다. 따라서 $string1은 일치에 실패하고 $string2는 성공적으로 일치됩니다. $string3이(가) 성공적으로 일치했습니다.