2011-05-27 2 views
1

J'essaie d'implémenter une expression régulière qui va essentiellement extraire tous les éléments de la ligne ELEMENTS.Comment trouver un bloc et le parcourir

dire que j'ai cette chaîne html:

<tr> <td> ELEMENTS</td> <td> <element>A1</element> , <element>A2</element> </td></tr><tr> <td> MORE_ELEMENTS</td> <td><element> A3</element>, <element> A4</element>, <element> A5</element> </td></tr> 

Et je veux extraire tous les éléments de la ELEMENT ligne (A1, A2 et A3), mais pas les éléments de la MORE_ELEMENTS ligne (A4, A5 et A6).

En utilisant cette expression rationnelle, vous pouvez correspondre à tous les éléments:

<element>([^<]+)<\/element>\s*,*\s* 

Mais si j'essaie de limiter à ELEMENT S en utilisant cette expression rationnelle:

<td>\s*ELEMENTS.*?<element>([^<]+)<\/element>\s*,*\s* 

Je Reconnait uniquement le premier élément. Je ne sais pas comment faire correspondre la ligne ELEMENTS et puis itérer à l'intérieur pour extraire tous les éléments.

Essayé cela aussi, mais ne fonctionne pas non plus:

<td>\s*ELEMENTS.*?<element>([^<]+)<\/element>\s*,*\s*(<element>([^<]+)<\/element>\s*,*\s*)* 

Toutes les idées? Merci d'avance!

Migsy

+1

Vous ne voulez pas faire cela avec regexp, cherchez plutôt un outil de type Meachanize. http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+0

Quelle plate-forme utilisez-vous? –

+0

@anders J'utilise PHP – Migsy

Répondre

1
$test = '<tr> <td> ELEMENTS</td> <td> <element>A1</element> , <element>A2</element> </td></tr><tr> <td> MORE_ELEMENTS</td> <td><element> A3</element>, <element> A4</element>, <element> A5</element> </td></tr>'; 

    preg_match_all ('~<element>([^<]*)</element>~', $test, $match); 

    foreach ($match [1] as $value) 
    { 
      // do what you inteded 
    } 

http://php.net/manual/en/function.preg-match-all.php

+2

RTFM est pas une réponse –

+0

Ajout d'un exemple. – akond

+0

j'ai sorti la downvote –

0

Il est généralement considéré comme une mauvaise idée pour analyser HTML ou XML avec des expressions régulières. Cela ne fonctionne pas dans le cas général, mais fonctionne bien pour des cas spécifiques si vous comprenez les limitations.

Cependant, juste parce que vous voulez utiliser des expressions régulières, il n'y a aucune raison d'insister sur seulement en utilisant des expressions régulières. Pour ce problème, utilisez une expression régulière pour extraire votre bloc, puis utilisez une autre expression ou une autre fonction sur le résultat. Vous ne gagnez pas de points de bonus pour avoir le plus possible une seule expression. Au contraire, il vaut mieux écrire du code lisible que d'écrire du code "intelligent".

Ceci est particulièrement vrai lorsque vous avez besoin de quelqu'un pour écrire l'expression pour vous. Si vous ne comprenez pas suffisamment les expressions régulières pour résoudre votre problème, essayez de limiter autant que possible la complexité de vos expressions en recherchant d'autres solutions ou en divisant un motif complexe volumineux en plusieurs motifs plus petits et plus compréhensibles.

Questions connexes