Не используйте регулярные выражения для анализа xml / html ...
С учетом вышесказанного проблема заключается в том, что структура соответствия выглядит следующим образом:
array(
0 => array('whole match1', 'whole match 2', 'whole match 3'),
1 => array('subpattern match 1', 'subpattern match 2', 'subpattern match 3'),
);
Итак, вместо того, чтобы выполнять свой foreach, выполните:
if (!empty($matches)) {
foreach ($matches[1] as $value) {
echo $value;
}
}
или используйте флаг PREG_SET_ORDER
для preg_match_all, что приведет к такой структуре массива, как:
array(
0 => array('whole match1', 'subpattern match 1'),
0 => array('whole match2', 'subpattern match 2'),
0 => array('whole match3', 'subpattern match 3'),
);
Итак, тогда ваш foreach станет:
if (!empty($matches)) {
foreach ($matches as $match) {
echo $match[1];
}
}