Regex PHP yanıt gövdesinde XML veri çekme ile ilgili yardım

3 Cevap php

Ben PHP ve Zend Framework kullanarak JMS kuyruğuna verileri çeker bir proje üzerinde çalışıyorum. HTTP istemci yanıt altındadır. Tüm ihtiyacım XML dizedir.

I / geldi (. *) <\ / RequestDetails> / gs http://gskinner.com/RegExr/ üzerinde ok sınar ama preg_match çağrı boş maçlar dizi dönen edilmektedir.

Ben bir desen etrafında avı devam edecek, ama ben de burada yayınlamak düşündüm ediyorum.

, Vb okumak herkese teşekkürler ..

Steve

GÜNCELLEME: Ben kodu doğru yapıştırmak için alınamıyor. İşte pastbin bir link: http://pastebin.com/rQxzcfSg

3 Cevap

Aşağıdaki kod parçası:

<?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);

?>

Bu çıktıyı üretir:

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

        )

)

I preg_match_all yerine /g bayrağı kullanılan ve aynı zamanda birden çok sonuç almak istediklerini gerçekten (.*?) isteksiz eşleştirme, kullandım.

Aşağıdaki metinde, bir fark yapar neden görmek, orada iki A.*?Z maçlar, ama sadece bir A.*Z.

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

Bu regex kullanarak XML Ayrıştırma tedbirsiz olduğunu söyledi. Uygun bir XML ayrıştırıcı kullanın; hayatınızı çok daha kolay yapacağız.

Ben PHP 5 SimpleXML gibi on-board araçları ile geldiğinde neden karmaşık ifadelerin rahatsız derdi?

$xml = simplexml_load_string($string); 

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

Sadece tabii ki, MIME parçalarını çıkarmak ve işlevi sadece ham XML göndermek gerekiyor.

Daha on SimpleXML burada.

Sizin g geçersiz. m yerine (satırlı için) kullanın. Deney /(.*)<\/RequestDetails>/gs ve /(.*)<\/RequestDetails>/ms ile this tester.