Preg_match_all возвращает массив в массиве? - PullRequest
5 голосов
/ 19 мая 2011

Я пытаюсь получить информацию из этого массива, но по какой-то причине он все вкладывает в $matches[0].

<?

$file = shell_exec('pdf2txt.py docs/April.pdf');

preg_match_all('/.../',$file,&$matches);
print_r($matches)

?>

Это работает как задумано? Есть ли способ поместить это в массив глубины 1?

EDIT:

Это RegEx:

([A-Z][a-z]+\s){1,5}\s?[^a-zA-Z\d\s:,.\'\"]\s?[A-Za-z+\W]+\s[\d]{1,2}\s[A-Z][a-z]+\s[\d]{4}

Ответы [ 2 ]

12 голосов
/ 19 мая 2011

preg_match_all() всегда возвращает массив (в случае успеха, в противном случае вы получаете пустой массив), где индекс 0 содержит массив с элементом для каждого полного совпадения, а другие индексы становятся группами захвата с внутренним массивомдля каждого матча.

Это может быть проще для понимания ...

array(2) {
  [0]=>
  array(2) {
    [0]=>
    string(12) "entire match"
    [1]=>
    string(32) "entire match matched second time"
  }
  [1]=>
  array(2) {
    [0]=>
    string(15) "capturing group"
    [1]=>
    string(35) "capturing group matched second time"
  }
}
1 голос
/ 19 мая 2011

Если ваша цель - получить только захваченные символы (то, что было захвачено вашими "([A-Z] [a-z] + \ s) {1,5}"), вам следует заглянуть внутрь $ match [1]. $ match [1] [0] содержит первую захваченную последовательность символов.

Согласно документам preg_match_all , если флаг заказа не указан (как в вашем примере), предполагается PREG_PATTERN_ORDER. Используя этот шаблон, вы обнаружите, что $ match [0] - это массив, который содержит все строки, которые соответствуют вашему полному шаблону, а $ match [1] содержит массив строк, захваченных вашим регулярным выражением.

...