>백엔드 개발 >PHP 튜토리얼 >이 PHP 정규식 preg_match가 때때로 false를 반환하는 이유는 무엇입니까?

이 PHP 정규식 preg_match가 때때로 false를 반환하는 이유는 무엇입니까?

WBOY
WBOY원래의
2016-09-19 09:16:241172검색

제목 그대로

<code class="php">echo var_dump(preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lo-n.l-on.loh-4va.ccccc5om'));//return 0
echo var_dump(preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lo-n.l-on.loh-4va.cccccom'));//return 1
echo var_dump(preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lon.lon.lon.loh4va.cccc5com'));//return false
echo var_dump(preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lon.lon.lon.loh4va.cccccom'));//return 1</code>

답글 내용:

제목 그대로

<code class="php">echo var_dump(preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lo-n.l-on.loh-4va.ccccc5om'));//return 0
echo var_dump(preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lo-n.l-on.loh-4va.cccccom'));//return 1
echo var_dump(preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lon.lon.lon.loh4va.cccc5com'));//return false
echo var_dump(preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lon.lon.lon.loh4va.cccccom'));//return 1</code>

필터링 중인 코드를 살펴보세요. int(0)은 일치하는 항목이 없음을 의미하고, int(1)은 일치하는 항목이 성공했음을 의미합니다.

코드 변경을 도와드리겠습니다. 그룹 캡처는 무분별하게 사용할 수 없으며, 일반 작성은 간결해야 하며, 작업 효율성은 최대한 향상되어야 하며, 불필요한 변수는 저장되지 않아야 합니다. 당신이 하고 있는 일을 이해하려면 일반 엔진의 역추적 원리를 이해해야 합니다.

보다 기본적인 지식을 얻으려면 최소한 욕심쟁이 매칭과 비욕심 매칭의 매칭 원리와 운영 효율성의 차이를 이해해야 합니다.

원본:

<code>preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lo-n.l-on.loh-4va.ccccc5om');</code>

변경:

<code>preg_match('/^(?:(?:\w+\.?\w+)-?){4}$/', 'lo-n.l-on.loh-4va.ccccc5om'); </code>

해당 질문을 토대로 분석해보겠습니다.

질문의 첫 번째 코드를 예로 들어보겠습니다.

<code>preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lo-n.l-on.loh-4va.ccccc5om')</code>

이 PHP 정규식 preg_match가 때때로 false를 반환하는 이유는 무엇입니까?

총 74781단계, 70,000단계가 넘게 걸렸습니다!
위에서 수정한 것으로 변경

<code>preg_match('/^(?:(?:\w+\.?\w+)-?){4}$/', 'lo-n.l-on.loh-4va.ccccc5om');</code>

이후:

이 PHP 정규식 preg_match가 때때로 false를 반환하는 이유는 무엇입니까?

34단계만 필요합니다.

매칭 과정을 분석합니다.
질문자:

이 PHP 정규식 preg_match가 때때로 false를 반환하는 이유는 무엇입니까?

수정된 일치 단계:

이 PHP 정규식 preg_match가 때때로 false를 반환하는 이유는 무엇입니까?

74781단계: 34단계는 대략 2200%와 같으며 효율성은 정말 엄청난 차이입니다.

------12월 29일 추가 ---
정규 학습에 대하여:
펄 학습에서 자세히 공부했습니다. 개인적으로 정규식을 잘 활용하려면 다음 사항을 준수해야 한다고 생각합니다.
1 탐욕적 매칭과 비탐욕적 매칭을 구분하세요
2 앵커를 사용해 보세요
3 무엇을 그룹화해 보세요
4개의 메타 문자를 그룹화할 수 있습니다. 열거하는 대신 필터링하고 요약하는 것이 더 좋습니다. 예를 들어, [a-zA-Z0-9]+는 w+만큼 좋지 않습니다. 1+만큼 좋습니다. 앵커 문자(b 앵커 단어, ?= ?>, ?!정방향 및 역방향 사전 검색)를 사용하면 소위 수량자 중첩이 더 빨라집니다. 매칭은 사용하지 말아야 합니다(+*는 최대한 적게 사용해야 역추적, 즉 역추적 횟수를 어느 정도 줄일 수 있습니다.
보다 지각적인 이해를 위해 남성 중에서 남성을 찾고 싶습니다. 10억 명의 사람들이 줄을 서 있는데 가장 눈에 띄는 특징 몇 가지만 말해 보세요. 예를 들어, 100만 평방킬로미터 떨어져 있는 두 그루의 나무는 모두 수컷입니다. 하나씩 확인해보세요

.

위.


  1. -s ↩

http://php.net/manual/zh/func...

preg_match()는 패턴과 일치하는 수를 반환합니다. preg_match()가 첫 번째 일치 후 검색을 중지하므로 해당 값은 0(일치 없음) 또는 1이 됩니다. preg_match_all()은 끝에 도달할 때까지 주제를 검색한다는 점에서 이와 다릅니다. 오류가 발생하면 preg_match()는 FALSE를 반환합니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.