我正在开发一个使用PHP和Zend Framework从JMS队列中提取数据的项目。 HTTP客户端响应如下。我只需要XML字符串。
我想出了/(。*)/ lt; /RequestDetails> / g,它在http://gskinner.com/RegExr/上测试正常,但preg_match调用返回一个空匹配数组。
我将继续寻找一种模式,但我想也会在这里发布。
感谢所有读过的人......
史蒂夫
更新:我无法正确粘贴代码。这是一个关于pastbin的链接:http://pastebin.com/rQxzcfSg
答案 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
。