2014-09-20 3 views
1

대괄호로 반복되는 단어의 모든 일치를 얻으려고합니다.모든 단어와 그 괄호 사이의 오프셋을 가져옵니다

$text = '{yes yes no yes} yes {yes no}'; 
"예"라는 단어에 대한

원하는 출력 : 나는 다음과 같은 정규 표현식을 시도했다, 그러나 최신 위치 만 단어를 반환

Array 
(
    [1] => Array 
     (
      [0] => Array 
       (
        [0] => yes 
        [1] => 1 
       ) 
     ) 

    [1] => Array 
     (
      [0] => Array 
        (
        [0] => yes 
        [1] => 5 
       ) 
     ) 

    [2] => Array 
     (
      [0] => Array 
        (
        [0] => yes 
        [1] => 12 
       ) 
     ) 

    [3] => Array 
     (
      [0] => Array 
        (
        [0] => yes 
        [1] => 22 
       ) 
     ) 
) 

:

preg_match_all("#\{[^}]*(yes)[^{]*\}#", $text, $matches, PREG_OFFSET_CAPTURE); 

I 많은 다른 해결책을 시도했지만 아무것도 작동하지 않습니다. 어떤 생각?

답변

0

당신은의 {} 내부에 존재하는 모든 문자열 yes에 맞게 긍정적 예측을 사용하는 다음 정규식을 시도 할 수

<?php 
$string = "{yes yes no yes} yes {yes no}"; 
preg_match_all("#yes(?=[^{}]*})#", $string, $matches, PREG_OFFSET_CAPTURE); 
echo print_r($matches); 
?> 

출력 :

Array 
(
    [0] => Array 
     (
      [0] => Array 
       (
        [0] => yes 
        [1] => 1 
       ) 

      [1] => Array 
       (
        [0] => yes 
        [1] => 5 
       ) 

      [2] => Array 
       (
        [0] => yes 
        [1] => 12 
       ) 

      [3] => Array 
       (
        [0] => yes 
        [1] => 22 
       ) 

     ) 

) 
+0

그것은 작동합니다! 고마워, 날 구했어! – Jeremie

+0

당신을 환영합니다 :-) –

0

정규식을 작성하여 }으로 끝나고 다른 정규 표현식을 수행 할 수 있습니다.

<?php 

$string = "{yes yes no yes} yes"; 

$matches = array(); 
preg_match_all("/yes[^}]*/", $string, $matches); 

echo print_r($matches, true); 

$final_matches = array(); 
preg_match_all("/yes/", "{".$matches[0][0], $final_matches, PREG_OFFSET_CAPTURE); 
echo print_r($final_matches, true); 

https://eval.in/196020

최종 출력 :

Array 
(
    [0] => Array 
     (
      [0] => Array 
       (
        [0] => yes 
        [1] => 1 
       ) 

      [1] => Array 
       (
        [0] => yes 
        [1] => 5 
       ) 

      [2] => Array 
       (
        [0] => yes 
        [1] => 12 
       ) 

     ) 

) 
+0

이미 시도해 보았습니다. 작동하지 않습니다. 오프셋이 잘못되었습니다. – Jeremie

+0

수정 된 "해킹"에 대한 답변이 업데이트되었습니다. –

+0

감사합니다. 단 하나의 브래킷 만있는 경우에만 작동합니다. 본문에는 많은 괄호가 있습니다. 그에 따라 질문을 업데이트했습니다. – Jeremie

관련 문제