2014-02-07 4 views
0

두 개의 정규 표현식을 preg_match_all 하나만 사용하여 일치 시키려고합니다. 일치 항목이 포함 된 2 개의 배열을 가져와야합니다. 결과 다차원 배열 인 것을 고려하지 않는 경우가 꽤 잘 작동preg_match_all 및 빈 키

$s = 'abab'; 
preg_match_all('/(a)|(b)/', $s, $a); 
var_dump($a); 

:

이 내 현재 코드입니다 그래서

array (size=3) 
    0 => 
    array (size=4) 
     0 => string 'a' (length=1) 
     1 => string 'b' (length=1) 
     2 => string 'a' (length=1) 
     3 => string 'b' (length=1) 
    1 => 
    array (size=4) 
     0 => string 'a' (length=1) 
     1 => string '' (length=0) 
     2 => string 'a' (length=1) 
     3 => string '' (length=0) 
    2 => 
    array (size=4) 
     0 => string '' (length=0) 
     1 => string 'b' (length=1) 
     2 => string '' (length=0) 
     3 => string 'b' (length=1) 

, 내가 $a[1]를 사용할 수 있으며, $a[2]하지만 알 수 있듯이이 배열에는 "일치하지 않는"키에 빈 값이 있습니다.

내가 필요한 것 :

array (size=3) 
    0 => 
    array (size=4) 
     0 => string 'a' (length=1) 
     1 => string 'b' (length=1) 
     2 => string 'a' (length=1) 
     3 => string 'b' (length=1) 
    1 => 
    array (size=2) 
     0 => string 'a' (length=1) 
     1 => string 'a' (length=1) 
    2 => 
    array (size=2) 
     0 => string 'b' (length=1) 
     1 => string 'b' (length=1) 

빈 값없이 깨끗한 출력을 얻을 수 preg_match_all에 전달하는 몇 가지 매개 변수가있다? 나는 이미 array_filter()을 시도했으나 을 제거하지 못해서 array_filter의 콜백을 사용할 수 없기 때문에 짧은 해결책을 찾고있다. (코드 - 골프 챌린지에 필요하다).

+0

이 출력은 설명서에서 설명한 것과 정확히 같습니다. "깨끗한 결과물"이 의미하는 것은 무엇입니까? – Jon

+0

나는 빈 값없이 출력을 요구하고있다. (내 질문에) –

+0

그것은'(a) | (b)'가 문자 제한이 아니기 때문이다. 3 항목 모두 결과가 정확합니다. –

답변

1

왜 이런 식으로해야할까요?하지만 가장 짧은 것은 당신의 요청을 만족시키기 위해 생각해 냈습니다.

$s = 'abab'; 
preg_match_all('/(a)|(b)/', $s, $a); 
// filter all at once 
$a = array_map('array_filter', $a); 
var_dump($a);