2010-05-24 3 views
0

Je travaille sur un projet qui tire des données de la file d'attente JMS en utilisant PHP et Zend Framework. La réponse du client HTTP est ci-dessous. Tout ce dont j'ai besoin est la chaîne XML.Aide avec regex tirant des données XML du corps de la réponse dans PHP

Je suis arrivé avec /(.*) </RequestDetails>/gs qui teste ok sur http://gskinner.com/RegExr/ mais l'appel preg_match renvoie un tableau de correspondances vide.

Je vais continuer à chercher un motif, mais je pense que je posterais aussi ici.

Merci à tous ceux qui lisent, etc ...

Steve

MISE À JOUR: Je ne peux pas obtenir le code à coller correctement. Voici un lien vers un pastbin: http://pastebin.com/rQxzcfSg

Répondre

1

L'extrait suivant:

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

?> 

Génère cette sortie:

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 

     ) 

) 

Je l'ai utilisé preg_match_all au lieu de /g drapeau, et également utilisé (.*?) correspondant réticents, ce qui est vraiment ce que vous voulez obtenir plusieurs correspondances.

Pour voir pourquoi cela fait une différence, dans le texte suivant, il y a deux correspondances A.*?Z, mais une seule A.*Z. Cela dit, analyser XML en utilisant regex est malavisé. Utilisez un analyseur XML approprié; ça va rendre ta vie beaucoup plus facile.

0

Je dirais, pourquoi s'embêter avec complexes Regex lorsque PHP 5 est livré avec des outils embarqués comme SimpleXML?

$xml = simplexml_load_string($string); 

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

Vous devez simplement supprimer les parties MIME et ne soumettre que le code XML brut à la fonction, bien sûr. Pour plus d'informations sur SimpleXML

+0

D'accord, mais le problème est que la réponse HTTP comprend plus de données que le XML dont j'ai besoin. J'ai besoin de sortir le XML de la réponse, puis charger la chaîne dans SimpleXML – spdaly

+0

@spdaly okay. Tant que le XML est clairement défini, une regex peut être le chemin à parcourir ici. –

0

Votre g n'est pas valide. Utilisez plutôt m (multiligne). Tester /(.*)<\/RequestDetails>/gs et /(.*)<\/RequestDetails>/ms en utilisant this tester.