2011-11-22 2 views
5

정규식에서 논리 연산자 "AND"를 사용하고 싶습니다. 논리 연산자 AND와 PHP 정규식

(?=exp1)(?=exp2) 

그러나 PHP ?=에서

작동 및 PHP 언어로 내 프로그램을 작성할 필요하지 않습니다 나는이 시도. 다른 방법이 있습니까? 모든 조건이 존재하고 어떤 순서로든 표현식이 일치해야합니다.

(exp1)(exp2)(exp3)|(exp1)(exp3)(exp2)|.... 
+0

정규식을 분할해야한다고 생각합니다 – DiogoDoreto

+4

음. php는'(? = ...)'를 지원합니다 : http://php.net/manual/en/regexp.reference.assertions.php –

답변

9

PHP는 내다 식을 지원하지 않습니다 : 내가 좋아하는 모든 순열을 쓰기 싶지 않아. 그래도 제대로 사용하지는 않을 것입니다.

당신이 foo, barbaz의 세 가지를 모두 포함 된 문자열을 일치시킬 가정하면,이 문자열 foobarbaz 또는 barbazfoo 등 그러나, 경기 일치를 반환합니다

^(?=.*foo)(?=.*bar)(?=.*baz) 

정규식이 필요 LookAhead가 문자를 소비하지 않기 때문에 빈 문자열이됩니다. 정규 표현식에서 문자열 자체를 반환하려면, 다음 세 가지 조건을 모두 충족하는 경우 전체 문자열과 일치하는

^(?=.*foo)(?=.*bar)(?=.*baz).* 

을 사용하십시오.

단순히 이것은 또한 foonly bartender bazooka 같은 문자열과 일치하는 것으로

if (preg_match('/^(?=.*foo)(?=.*bar)(?=.*baz)/s', $subject)) { 
    # Successful match 
} else { 
    # Match attempt failed 
} 

를 적어 둡니다을 사용합니다. 당신은 당신이 약간의 트릭으로 그것을 할 수 있습니다 (단 하나의 세 가지 표현의 각각의 순수한 순열을 허용하는) 것을 원하지 않는 경우 :

^(?:foo()|bar()|baz()){3}\1\2\3$ 

경기 foobarbaz, foobazbar, barfoobaz, barbazfoo, bazfoobarbazbarfoo을 (그리고 아무것도). "트릭"은 Jan Goyvaerts와 Steven Levithan의 훌륭한 책인 "Regular Expressions Cookbook" (304 페이지)에서 영감을 얻은 것입니다.

  • 각각의 필요한 부분 (foo 등) 필요한 부분이 일치 한 경우 항상 일치하는 빈 캡처 그룹 () 뒤에 : 다음과 같이 작동합니다.
  • 이렇게 필요한 세 부분이 모두 일치하면 빈 캡쳐 그룹이 모두 일치합니다.
  • 다음 역 참조는 각 캡처 그룹이 일치 항목에 참여한 경우에만 성공합니다.
  • 문자열이 foobarbar 인 경우 (?:foo()|bar()|baz()){3} 부분은 일치하지만 \3 부분은 실패하므로 전체 정규식이 실패합니다.
  • 그러나 캡처 링 그룹에 빈 문자열 만 있기 때문에 \1\2\3은 문자열 끝에 일치하는 데 성공합니다. @ 팀의 대답에 추가
+0

좋은 답변입니다. +1 – FailedDev

+0

@ temp이 자료를 보충 할 수 있습니까? 나는 전에 foo() | bar() | baz() 같은 것을 본 적이 없다. – bozdoz

+0

나는 빈 괄호의 의미가 무엇인지 묻고있다. – bozdoz

1

:

(?=exp1)(?=exp2) 

이 사실이 될 수 없다.당신은 평범한 영어로 말합니다. 여기에 나오는 텍스트가 exp1인지 확인하고 여기에있는 텍스트가 exp2 인지도 확인하십시오. 이것은 사실이 아닙니다. 결코 일치하지 않을 것입니다.