개발 스크랩 메모/PHP
논리적 연산자 및 php 정규 표현식
렉사이
2020. 12. 21. 22:39
나는 정규 표현식에서 논리적 연산자'AND'를 사용하고 싶다.
내가 이거 해봤어:
(?=exp1)(?=exp2)
근데 PHP 중에?= 작용이 없으니 PHP 언어 작성 프로그램이 필요하다.
또 다른 방법이 있나요?모든 조건과 어떤 순서가 존재한다면 표현식은 일치해야 한다.
나는 모든 배열상을 쓰고 싶지 않다:
(exp1)(exp2)(exp3)|(exp1)(exp3)(exp2)|....
대답
PHP 는 Lokahead 표현식을 확실히 지지합니다.
그러나 너는 그것들을 정확히 사용하지 않았을 것이다.
foo, bar, baz 3자의 문자열을 포함하려면 regex
^(?=.*foo)(?=.*bar)(?=.*baz)
이 문자열 foobarbarbaz나 barbazfoo 등의 일치 항목을 되돌릴 것입니다.
하지만 이 일치 항목은 빈 문자열 (lookaheads 는 어떤 문자를 사용하지 않기 때문입니다.
만약 regex 문자열 자체로 되돌아가기를 희망한다면 사용하십시오
^(?=.*foo)(?=.*bar)(?=.*baz).*
이 세 가지 조건을 충족한다면, 전체 문자열에 일치한다.
저는 그냥 쓰고 싶어요.
if (preg_match('/^(?=.*foo)(?=.*bar)(?=.*baz)/s', $subject)) { # Successful match } else { # Match attempt failed }
이 또한 미식바 로켓과 같은 문자열을 맞추어 주십시오.만약 당신이 그러기 싫어한다면 (3개의 표현식 중 하나하나 모두 하나의 순수한 치환), 당신은 작은 테크닉으로 실현할 수 있습니다:
^(?:foo()|bar()|baz()){3}\1\2\3$
foobarbaz, foobazbar, barfoobaz, barbazfoo, bazfoobar, bazbarfoo'비결'의 영감은 Jan Goyvaerts, Seven Levithan 의 우수 저작'정규 표현식 식단'(304페이지)에서 비롯됐다.
그 작업 원리는 다음과 같다:
- Each required part (
foo
etc.) is followed by an empty capturing group()
which always matches if the required part has been matched. - So if all three required parts have matched, all three empty capturing groups have matched.
- The following backreferences only succeed if each of the capturing groups has participated in the match.
- So if the string is
foobarbar
, the part(?:foo()|bar()|baz()){3}
will have matched, but\3
fails, so the overall regex fails. - If, however, all three did take part in the match,
\1\2\3
succeeds in matching at the end of the string because each of the capturing groups contains nothing but the empty string.