2012-03-05 5 views
27

나는 preg_match와 preg_match_all을 사용하여 주어진 문자열에서 정규 표현식 패턴의 실제 일치를 찾는 방법을 알고 있지만 필자가 작성한 함수는 일치하는 텍스트를 필요로 할뿐만 아니라 일치하는 문자열을 탐색 할 수있다. ...문자열에서 정규식 일치의 위치를 ​​얻는 방법은 무엇입니까?

따라서 정규식 패턴을 기반으로 문자열에서 일치하는 위치를 알아야합니다.

정규식을 허용하는 strpos()와 유사한 함수를 찾을 수없는 것 같습니다. 어떤 아이디어입니까?

+0

일단 일치하면 'strpos()'를 사용하여 위치를 찾을 수 없습니까? – scibuff

+0

중복 : http://stackoverflow.com/questions/3547564/running-a-regular-expression-need-to-find-exact-location-of-a-string-patterns – michaelmichael

+0

일치 항목이 있으면 그런 다음 strpos()를 사용하여 문자열 내의 위치를 ​​찾습니다. – SenorAmor

답변

59

당신은 그것을 위해 플래그 PREG_OFFSET_CAPTURE를 사용할 수 있습니다

preg_match('/(bar)/', 'Foobar', $matches, PREG_OFFSET_CAPTURE); 
var_export($matches); 

결과는 다음과 같습니다

array (
    0 => 
    array (
    0 => 'bar', 
    1 => 3,  // <-- the string offset of the match 
), 
    1 => 
    array (
    0 => 'bar', 
    1 => 3, 
), 
) 
+0

왜 결과가 두 번 반환 되었습니까? – ananda

+2

@ananda이 첫 번째 일치는 정규 표현식의 * all *입니다. 두 번째는 첫 번째 캡처 그룹입니다. 우연히도, 위의 코드에서 둘 다 동일합니다. 예를 들어 정규 표현식이'/ Foo (bar) /'인 경우 첫 번째 결과는 오프셋이 0 인 Foobar이고 두 번째 결과는'bar '(오프셋 3)입니다. 위. –

4

는 preg_match는 선택 플래그, PREG_OFFSET_CAPTURE을 가지고, 그 원래의 일치의 선두로부터의 캐릭터 위치를 기록 '커다란 건초 더미'. 'flags'섹션을 참조하십시오 : http://php.net/preg_match

0

preg_match()에서 PREG_OFFSET_CAPTURE를 사용하면 패턴 일치와 관련된 횟수가 표시됩니다. 일치가 있으면 0부터 시작하는 오프셋 값을가집니다.

이 값을 사용하면 오프셋 매개 변수를 사용하여 preg_match를 다시 호출 할 수 있습니다.

관련 문제