2010-01-25 3 views
4

나는 이들 중 하나가, 다른 한 후 '더 나은'입니다 있는지 확실하지 않습니다 이유는 것,하지만이처럼 보이는 원래 문자열있어 :가,훑어보기 또는 캡처 그룹을 사용하는 것이 더 좋습니까?

$string = '/random_length_user/file.php'; 

을 이제 두 위해,

preg_match("%(?<=^/)([^/]*)%", $string, $capture); 
preg_match("%^/([^/]*)%", $string, $capture); 

그들은 반환 : : 방법이없이, 나의 새로운 친구, 모양 숨김 및 2를 사용하여, 첫 번째를 맞게

Array 
(
    [0] => random_length_user 
) 
Array 
(
    [0] => /random_length_user 
    [1] => random_length_user 
) 

는 기본적으로 나는 결과 I를 얻을 수 안으로 들어가고 싶다. look-behind를 사용하는 $ capture [0], 그리고 $ capture [1]없이. 이제 문제는 ... 이러한 방법 중 하나를 다른 것보다 선호하는 이유가 있습니까?

답변

1

문제는 lookbehind 방식이 유연하지 않다는 것입니다. 그것은 가변 길이 매치를 다루기 시작할 때 쓰러진다. 예를 들어, 예제에서 파일 이름을 추출하려고했지만 디렉토리의 이름을 알지 못했다고 가정하십시오.

preg_match("%^/\w+/([^/]*)%", '/random_length_user/file.php'); 

Array 
(
    [0] => /random_length_user/file.php 
    [1] => file.php 
) 

을 ...하지만 lookbehind 표현은 문자의 고정 수와 일치 할 수 있기 때문에 lookbehind 접근법은하지 않습니다 : 캡처 그룹의 기술은 여전히 ​​잘 작동합니다. 그러나 더 나은 대안이 있습니다 : \K, MATCH POINT RESET 연산자. 어디에서든지 정규 표현식 엔진은이 게임이 실제로 시작된 것처럼 보입니다. 그래서 당신은 같은 결과는 고정 길이 제한없이 lookbehind와 마찬가지로 얻을 :

preg_match('%^/\w+/\K[^/]+$%', '/random_length_user/file.php'); 

Array 
(
    [0] => file.php 
) 
지금까지 내가 아는 한,이 기능은 (Perl로 5.10+ 및 도구에서만 사용할 수 있습니다

PHP의 preg_ 기능 등)는 PCRE 라이브러리에 의해 구동됩니다. PCRE 참조는 the manpage을 참조하고 \K을 검색 (F3)하십시오.

3

아마도 preg_match과 차이가 없지만 preg_replace을 사용할 경우 문제가되므로 교체 대상에 영향을 미칩니다.

는 글로벌 경기를 할 때 캡처 그룹 문자를 소비하기 때문에 또한, 문제가 될 수있는 반면, lookarounds하지 않습니다

사소한 예 : 'aaaa'

  • /(?<=a)a/gArray('a', 'a', 'a')
  • 을 제공합니다
  • /(a)a/g'aaaa'Array('aa', 'aa')
관련 문제