Следующий фрагмент:
<?php
$text = <<<EOT
blah blah <0>
<RequestDetails><1><2><3>test</RequestDetails>
<RequestDetails><4><5><6>blah
more blah blah
</RequestDetails>
blah blah <7>
EOT;
print $text;
preg_match_all('/<RequestDetails>(.*?)<\/RequestDetails>/s', $text, $matches);
print_r($matches);
?>
Генерирует этот вывод:
blah blah <0>
<RequestDetails><1><2><3>test</RequestDetails>
<RequestDetails><4><5><6>blah
more blah blah
</RequestDetails>
blah blah <7>
Array
(
[0] => Array
(
[0] => <RequestDetails><1><2><3>test</RequestDetails>
[1] => <RequestDetails><4><5><6>blah
more blah blah
</RequestDetails>
)
[1] => Array
(
[0] => <1><2><3>test
[1] => <4><5><6>blah
more blah blah
)
)
Я использовал preg_match_all
вместо /g
flag, а также использовал (.*?)
неохотное совпадение, которое действительно то, что вы хотите получить несколько совпадений.
Чтобы понять, почему это имеет значение, в следующем тексте есть два A.*?Z
совпадения, но только один A.*Z
.
---A--Z---A--Z----
^^^^^^^^^^^
A.*Z
Тем не менее, синтаксический анализ XML с использованием регулярных выражений не рекомендуется. Используйте правильный XML-парсер; это сделает вашу жизнь намного проще.