PHP 정규 표현의 메타문자
메타문자
는 문제를 발생시킵니다. d는 한 문자와 일치함을 의미합니다. 그리고 이제 10개나 8개를 매칭하고 싶은데, 숫자가 여러 개 있으면 어떻게 해야 하나요?
이번에는 메타문자를 사용하겠습니다. Atom을 사용할 때 한 문자만 일치할 수 있지만 여러 문자를 일치시키면 문제가 발생한다는 것을 알았습니다.
이때 원자를 수정하고 더 많은 기능을 달성하려면 메타문자를 사용해야 합니다.
다음 사항에 겁먹지 마세요. 우리는 조금씩 실험을 해보면 모든 것을 이해할 수 있을 것입니다. 가장 중요한 것은 이것이 더 다양하다는 것입니다.
기억할 수 있도록 작은 카드를 준비하는 것이 가장 좋습니다.
한번 살펴보겠습니다:
元字符 | 功能说明 |
---|---|
* | 是代表匹配前面的一个原子,匹配0次或者任意多次前面的字符。 |
+ | 匹配一次或多前前面的一个字符 |
? | 前面的字符可有可无【可选】 有或没有 |
. | 更标准一些应该把点算作原子。匹配除了n以外的所有字符 |
或者。注:它的优先级最低了。 | |
^ | 必须要以抑扬符之后的字符串开始 |
$ | 必须要以$之前的字符结尾 |
b | 词边界 |
B | 非边界 |
{m} | 有且只能出现m次 |
{n,m} | 可以出现n到m次 |
{m,} | 至少m次,最大次数不限制 |
() | 改变优先级或者将某个字符串视为一个整体,匹配到的数据取出来也可以使用它 |
+는 앞의 문자
<?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 = "!@!@!!@#@!$@#!"; //待会儿再试试中间没有0-9的情况 //$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 '没有匹配到'; } ?>
는 $string과 일치하고, $string2는 성공하지만 $string1과 일치하지 않습니다.
매칭 전후에 ABC가 있고 중간에 0~9가 있기 때문에 0~9는 선택사항이지만 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 또는 $ 문자열3).
2. 하지만 일치하는 배열에 요소가 하나 더 있고 이 요소의 첨자는 1입니다.
3. ()의 내용이 성공적으로 일치하는 한 일치된 데이터는 인덱스 1을 가진 이 배열 요소에 배치됩니다.
^(circumflex), ^
<?php $zz = '/^猪哥好帅\w+/'; $string1 = "猪哥好帅abccdaaaasds"; //$string2没有以猪哥好帅开始 $string2 = "帅abccdaaaasds"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
뒤의 문자열로 시작해야 합니다. 실험을 통해 다음과 같은 결론을 얻었습니다.
1.$string1 일치는 성공했지만 $string2는 성공적으로 일치하지 않습니다
2. $string1이 지정된 문자로 시작하기 때문입니다
3. $string2는 ^
<🎜 다음 문자로 시작하지 않습니다. > 4. 이 정규 규칙의 번역 의미는 다음과 같습니다. "Zhu 형제는 너무 잘생겼습니다."로 시작하고 그 뒤에 최소한 하나의 문자 a-zA-Z0-9_가 옵니다.$(달러 기호)는 $
<?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 중 적어도 하나를 나타낸다
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 '没有匹配到'; } ?>
요약:
1. $string1 일치는 성공했지만 $string2 일치는 실패했습니다.
2. B 뒤에 this가 오기 때문에 단어 경계(공백 및 시작과 끝)에는 이 단어가 나타날 수 없습니다.
{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번만 나타나며, 그 이상도, 그 이하도 아닙니다.
{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 '没有匹配到'; } ?>
결론:
위의 예에서는 d{1에 0-9를 지정했습니다. 3} 한 번, 두 번, 세 번만 나타날 수 있습니다. 그 외 모든 시간은 모두 틀렸습니다
{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의 숫자가 적어도 두 번 나타나도록 규정하고 있으며 최대 횟수에는 제한이 없습니다. 따라서 $string1은 일치에 실패하고 $string2는 성공적으로 일치됩니다. $string3이(가) 성공적으로 일치했습니다.