Помогите с регулярным выражением извлечения XML-данных из тела ответа в PHP - PullRequest
0 голосов
/ 24 мая 2010

Я работаю над проектом, который извлекает данные из очереди JMS с использованием PHP и Zend Framework. HTTP-ответ клиента приведен ниже. Все, что мне нужно, это строка XML.

Я придумал /(.*)/gs, который хорошо работает на http://gskinner.com/RegExr/, но вызов preg_match возвращает пустой массив совпадений.

Я собираюсь продолжить поиск шаблона, но подумал, что я тоже опубликую здесь.

Спасибо всем, кто читает и т.д ...

Steve

ОБНОВЛЕНИЕ: я не могу заставить код вставлять правильно. Вот ссылка на пастбин: http://pastebin.com/rQxzcfSg

Ответы [ 3 ]

1 голос
/ 24 мая 2010

Следующий фрагмент:

<?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-парсер; это сделает вашу жизнь намного проще.

0 голосов
/ 24 мая 2010

Ваш g недействителен.Вместо этого используйте m (для мультилинии).Проверьте /(.*)<\/RequestDetails>/gs и /(.*)<\/RequestDetails>/ms, используя этот тестер .

0 голосов
/ 24 мая 2010

Я бы сказал, зачем беспокоиться о сложных регулярных выражениях, если PHP 5 поставляется с такими встроенными инструментами, как SimpleXML ?

$xml = simplexml_load_string($string); 

print_r($xml); // should output complete tree for you to walk through easily

Вам просто нужно удалить части MIME и, конечно, передать в функцию только необработанный XML.

Подробнее о SimpleXML здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...