【问题标题】:Help with regex pulling XML data from response body in PHP帮助正则表达式从 PHP 中的响应正文中提取 XML 数据
【发布时间】:2010-05-24 13:00:57
【问题描述】:

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

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

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

感谢所有阅读的人,等等......

史蒂夫

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

【问题讨论】:

    标签: php xml regex parsing


    【解决方案1】:

    下面的sn-p:

    <?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 解析器;它会让你的生活更轻松。

    【讨论】:

      【解决方案2】:

      我会说,当 PHP 5 带有像 SimpleXML 这样的板载工具时,为什么还要麻烦复杂的正则表达式?

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

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

      更多关于SimpleXML这里。

      【讨论】:

      • 同意,但问题是 HTTP 响应包含更多数据,而不仅仅是我需要的 XML。我需要从响应中提取 XML,然后将字符串加载到 SimpleXML
      • @spdaly 好的。只要明确定义了 XML,正则表达式可能就是这里的方法。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-17
        • 1970-01-01
        相关资源
        最近更新 更多