Qu'est-ce regex correspondrait à une table imbriquée avec le texte identifiable dans la cellule du tableau?
-
19-09-2019 - |
Question
Qu'est-ce regex correspondre à un tableau imbriqué avec le texte identifiable dans la cellule du tableau? Je l'ai essayé, mais a échoué à trouver une expression régulière pour extraire la table spécifique que je veux avec en saisissant le début et la fin des deux tables dans l'exemple. Voici quelque chose pour commencer: « <table>.*?</table>
»
<table>
<tr>
<td>
<table>
<tr><td>Code1</td></tr>
<tr><td>some data</td></tr>
<tr><td>etc ...</td></tr>
</table>
</td>
</tr>
<tr>
<td>
<table>
<tr><td>Code2</td></tr>
<tr><td>some data</td></tr>
<tr><td>etc ...</td></tr>
</table>
</td>
</tr>
</table>
Dire que je veux extraire la table contenant « Code2 ». Qu'est-ce que regex correspondent spécifiquement et uniquement cette table?
La solution
Le regex suivant trouverez votre table:
(?ms)<table>((?!<table>).)*<td>Code2</td>.*?</table>
Avec (?ms)
vous allumez « matchs multilignes » (m)
et « point correspond à des sauts de ligne, trop » (s)
. Ensuite, vous avez un (?!)
négatif pour lookahead vous assurer que vous avez pas de deuxième début d'une table à l'intérieur de votre correspondance.
Autres conseils
Je ne voudrais pas utiliser une expression rationnelle à ce sujet, puisque HTML n'est pas régulière, et il n'y a pas de fin de cas de pointe pour vous faire trébucher. Vous êtes mieux à l'aide d'un analyseur HTML. Quelle que soit la langue ou la plate-forme que vous utilisez, il y aura un disponible.
Ne pas utiliser une expression régulière. Utilisez un analyseur HTML!
Cependant, en Perl (en supposant que vous n'avez pas tables imbriquées):
$xml =~ /<table>.*<td>Code2<\/td>.*<\/table>/s;