Regex PRCE PHP preg_match_all: Как удалить пустые узлы в массиве совпадений? - PullRequest
0 голосов
/ 22 марта 2011
$text = 'Lorem Ipsum';
$re = '/(?<AA>Any)|(?<BB>Lorem)/ui';
$nMatches = preg_match_all($re, $text, $aMatches);

$aMatches будет содержать следующее:

Array (
    [0] => Array (
            [0] => Lorem
        )

    [AA] => Array (       //  do not include to result matches array
            [0] =>        //  because have not match for this part
        )

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

    [BB] => Array (
            [0] => Lorem
        )

    [2] => Array (
            [0] => Lorem
        )
)

Вопрос: Можно ли вернуть массив без узлов для именованных частей, которые не имеют совпадений?

 Array (
        [0] => Array (
                [0] => Lorem
            )

        {there was [AA] && [1], but have not returned because empty} 

        [BB] => Array (
                [0] => Lorem
            )

        [1] => Array (        // changed to 1
                [0] => Lorem
            )
    )

Ответы [ 2 ]

2 голосов
/ 22 марта 2011

Специально для регулярных выражений вы можете увидеть @ ответ Стефана . В целом, когда вы просто манипулируете массивами, вы можете использовать комбинацию array_map и array_filter . array_filter без обратного вызова удалит значения, которые оцениваются как false (== false не === false, см. пусто ).

Для одноуровневого массива:

$array = array('foo', '', 'bar');
$clean_array = array_filter($array);

Для двумерного массива:

$clean_array = array_filter(array_map('array_filter', $array));
0 голосов
/ 22 марта 2011

Вы можете добиться чего-то похожего, используя оператор сброса ветви:

/(?|(?<BB>Any)|(?<BB>Lorem))/ui

выходы

  • [0] => массив
    • [0] => Lorem
  • [BB] => массив
  • [0] => Lorem
[1] => массив
  • [0] => Lorem

При использовании этого оператора именованные группы должны иметь одинаковое имя .

Вы проверяете регулярное выражение здесь .

...