帮助正则表达式从PHP中的响应主体中提取XML数据

时间:2010-05-24 13:00:58

标签: php xml regex parsing

我正在开发一个使用PHP和Zend Framework从JMS队列中提取数据的项目。 HTTP客户端响应如下。我只需要XML字符串。

我想出了/(。*)/ lt; /RequestDetails> / g,它在http://gskinner.com/RegExr/上测试正常,但preg_match调用返回一个空匹配数组。

我将继续寻找一种模式,但我想也会在这里发布。

感谢所有读过的人......

史蒂夫

更新:我无法正确粘贴代码。这是一个关于pastbin的链接:http://pastebin.com/rQxzcfSg

3 个答案:

答案 0 :(得分:1)

以下代码段:

<?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标记,并且还使用了(.*?)不情愿的匹配,这实际上就是您希望获得多个匹配。

要了解它为何有所作为,在下文中,有两个A.*?Z个匹配,但只有一个A.*Z

 ---A--Z---A--Z----
    ^^^^^^^^^^^
       A.*Z

也就是说,使用正则表达式解析XML是不明智的。使用适当的XML解析器;它会让你的生活更轻松。

答案 1 :(得分:0)

我会说,当PHP 5附带SimpleXML等板载工具时,为什么还要使用复杂的Regex?

$xml = simplexml_load_string($string); 

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

当然,您只需删除MIME部分并仅将原始XML提交给该函数。

此处更多关于SimpleXML

答案 2 :(得分:0)

您的g无效。请改用m(对于多行)。使用this tester测试/(.*)<\/RequestDetails>/gs/(.*)<\/RequestDetails>/ms