정규식에서 논리 연산자 "AND"를 사용하고 싶습니다. 논리 연산자 AND와 PHP 정규식
(?=exp1)(?=exp2)
그러나 PHP ?=
에서
(exp1)(exp2)(exp3)|(exp1)(exp3)(exp2)|....
정규식에서 논리 연산자 "AND"를 사용하고 싶습니다. 논리 연산자 AND와 PHP 정규식
(?=exp1)(?=exp2)
그러나 PHP ?=
에서
(exp1)(exp2)(exp3)|(exp1)(exp3)(exp2)|....
PHP는 내다 식을 지원하지 않습니다 : 내가 좋아하는 모든 순열을 쓰기 싶지 않아. 그래도 제대로 사용하지는 않을 것입니다.
당신이 foo
, bar
및 baz
의 세 가지를 모두 포함 된 문자열을 일치시킬 가정하면,이 문자열 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
, bazfoobar
및 bazbarfoo
을 (그리고 아무것도). "트릭"은 Jan Goyvaerts와 Steven Levithan의 훌륭한 책인 "Regular Expressions Cookbook" (304 페이지)에서 영감을 얻은 것입니다.
foo
등) 필요한 부분이 일치 한 경우 항상 일치하는 빈 캡처 그룹 ()
뒤에 : 다음과 같이 작동합니다.foobarbar
인 경우 (?:foo()|bar()|baz()){3}
부분은 일치하지만 \3
부분은 실패하므로 전체 정규식이 실패합니다.\1\2\3
은 문자열 끝에 일치하는 데 성공합니다. @ 팀의 대답에 추가:
(?=exp1)(?=exp2)
이 사실이 될 수 없다.당신은 평범한 영어로 말합니다. 여기에 나오는 텍스트가 exp1인지 확인하고 여기에있는 텍스트가 exp2 인지도 확인하십시오. 이것은 사실이 아닙니다. 결코 일치하지 않을 것입니다.
정규식을 분할해야한다고 생각합니다 – DiogoDoreto
음. php는'(? = ...)'를 지원합니다 : http://php.net/manual/en/regexp.reference.assertions.php –