我正在做一个使用PHP和Zend Framework从JMS队列中提取数据的项目。HTTP客户端响应如下所示。我所需要的只是XML字符串。
我提出了/(.*)/gs,它在http://gskinner.com/RegExr/上测试正常,但是preg_match调用返回一个空的matches数组。
我将继续寻找一种模式,但我想我也会在这里发布。
感谢所有读过的人,等等。
史蒂夫
更新:我无法正确粘贴代码。这里有一个指向粘贴站的链接:http://pastebin.com/rQxzcfSg
发布于 2010-05-24 21:18:49
以下代码片段:
<?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也就是说,使用regex解析XML是不明智的。使用适当的XML解析器;这将使您的工作变得更容易。
发布于 2010-05-24 21:14:51
我想说,既然PHP5附带了像SimpleXML这样的板载工具,为什么还要为复杂的正则表达式而烦恼呢
$xml = simplexml_load_string($string); 
print_r($xml); // should output complete tree for you to walk through easily当然,您只需删除MIME部分,只向函数提交原始XML即可。
有关SimpleXML的更多信息,请点击此处。
发布于 2010-05-24 21:22:59
您的g无效。请改用m (用于多行)。使用this tester测试/(.*)<\/RequestDetails>/gs和/(.*)<\/RequestDetails>/ms。
https://stackoverflow.com/questions/2897134
复制相似问题