2011-09-16 7 views
0

Comment utiliser une expression régulière pour analyser XML?Utilisation de PHP regex pour analyser XML

Supposons que nous avons les éléments suivants:

$string = '<z>1a<z>2b</z>3c<z>4d</z>5e</z>'; 
preg_match_all('/<z>(.+)<\/z>/', $string, $result_a); 
preg_match_all('/<z>(.+)<\/z>/U', $string, $result_b); 
preg_match_all($regex, $string, $result_x); 

Si j'exécuter cela, alors $ result_a aura la chaîne (parmi les éléments du tableau):

'1a<z>2b</z>3c<z>4d</z>5e' 

En outre, la variable result_b de $ aura les cordes (parmi les éléments du tableau):

'1a<z>2b' 
'4d' 

maintenant, je veux $result_x pour avoir '2b' et '4d' séparément, parmi les éléments du tableau.

À quoi devrait ressembler $regex?

Merci d'avance !!!

Répondre

3

utilisation non gourmand quantificateurs:

'/<z>(.+?)<\/z>/' 
    ___^ 

ou changer le point par une classe de caractère négatif:

'/<z>([^z]+)<\/z>/' 

ou

'/<z>([^<>]+?)<\/z>/' 

ou, beaucoup plus pratique, utilisez un xml parser

+0

L'utilisation de cette expression rationnelle génère le même résultat que le second que j'ai décrit dans l'exemple. – busce11

+0

@ busce11: voir ma réponse éditée. – Toto

+0

Cela est valide, mais j'aurais besoin de z pour être n'importe quel type de balise XHTML. J'ai posté l'exemple en utilisant z tag à des fins d'abstraction, mais avec z je veux dire n'importe quel tag. L'utilisation d'une balise dont le nom est basé sur deux caractères ou plus avec votre expression régulière correspondrait de manière négative aux caractères qui forment l'étiquette de nom, et non à l'étiquette de nom. – busce11

3

Dans ce cas, vous pouvez utiliser un quantificateur non gourmand ou vous pouvez utiliser cette alternative regex:

'/<z>([^<]+)<\/z>/' 

[^<] capture tous les caractères sauf <.

+0

Désolé, j'ai oublié de le dire: le contenu des balises peuvent inclure < and > caractères. – busce11