2014-12-13 2 views
0

정규식을 사용하여 짧은 태그를 찾는 문자열을 구문 분석하는 함수가 있습니다. 첫 번째 것을 찾았지만 그 이후는 찾지 못합니다. 무엇을 바꾸어야합니까?정규식의 여러 인스턴스 찾기

$str = blah blah [img]inner1[/img] blah [img]inner2[/img] 

function img_short($str) 
{ 
    preg_match('/\[\bimg\b\](.*?)\[\/\bimg\b\]/', $str, $match); 

    if ($match) { 
     $out = $match; 
    } else { 
     $out = $str; 
    } 
    return $out; 
} 

내 출력

["[img]inner1[/img]", "inner1"] 
+1

'preg_match_all'을 사용하여 글로벌 일치를 수행하십시오. –

답변

1

preg_match()만을 최초로 출현 찾은 단지 제 정규식 손잡이를 포함하는 어레이이다. 을 찾으려면 어카운트 preg_match_all()을 사용해야합니다.

$str = 'blah blah [img]inner1[/img] blah [img]inner2[/img]'; 
$match = array(); 
preg_match_all('/\[\bimg\b\](.*?)\[\/\bimg\b\]/', $str, $match, PREG_SET_ORDER); 
print_r($match); 

출력은 :

Array 
(
    [0] => Array 
     (
      [0] => [img]inner1[/img] 
      [1] => inner1 
     ) 
    [1] => Array 
     (
      [0] => [img]inner2[/img] 
      [1] => inner2 
     ) 
) 

UPDATE : @pguardiario가 언급 된 바와 같이

상기 \b가 필요하지 않다. 그들은 가치를 부가하지 않고 단지 정규 표현식을 복잡하게 만든다. 여기에 간단한 정규식 제공 :

preg_match_all('#\[img\](.*?)\[/img\]#', $str, $match, PREG_SET_ORDER); 

가 나는 또한 탈출 적은 문자 (/img에서 /)을 가지고 #에 정규식 구분 기호를 변경했습니다.

+1

그'\ b'는 쓸모가 없습니다. 그들은 전혀 아무것도하지 않습니다. – pguardiario

+0

맞습니다. 나는 정규 표현식을 분석하지 않았다. 문제는 그것이 모든 사건과 일치한다는 것에 관한 것이었다. 나는 이제 단순화 된 정규식으로 대답을 업데이트했다. – axiac

+0

더 나은 방법이지만 구분 기호를 변경해도 도움이되지 않습니다. 읽기가 어려워집니다. – pguardiario