2009-07-30 9 views
0

Salutations!Regex pour extraire les éléments par nom de classe

J'ai du code HTML valide ou non. Si le code HTML est invalide, une meilleure tentative peut être faite, et toutes les erreurs qui surviennent sont acceptables (c'est-à-dire, regrouper trop parce qu'une étiquette n'est pas fermée correctement).

Dans ce code HTML, il existe une variété d'éléments, dont certains peuvent avoir une classe (appelez-le "findme"). Ces éléments sont de type variable; certains img, un objet , certains un, etc.

je besoin d'un regex qui va tirer tous les éléments et le contenu qu'ils contiennent si elles contiennent du contenu.

Par exemple:

<div> 
<span><img class="findme" src="something" /></span> 
<object class="findme" classid="clsid:F08DF954-8592-11D1-B16A-00C0F0283628" id="Slider1" width="100" height="50"> 
    <param name="BorderStyle" value="1" /> 
    <param name="MousePointer" value="0" /> 
    <param name="Enabled" value="1" /> 
    <param name="Min" value="0" /> 
    <param name="Max" value="10" /> 
</object> 
</div> 

Exécution du regex sur ce morceau de HTML devrait revenir 2 éléments:

<img class="findme" src="something" /> 

et

<object class="findme" classid="clsid:F08DF954-8592-11D1-B16A-00C0F0283628" id="Slider1" width="100" height="50"> 
     <param name="BorderStyle" value="1" /> 
     <param name="MousePointer" value="0" /> 
     <param name="Enabled" value="1" /> 
     <param name="Min" value="0" /> 
     <param name="Max" value="10" /> 
    </object> 

Tout vous gourous regex là-bas ont une idée sur celui-ci?

Édition: La langue est C#.

+0

Pourriez-vous préciser le langage de programmation que vous utilisez pour ce travail? –

Répondre

4

Alors que les expressions régulières peuvent être bonnes pour une grande variété de tâches, je trouve que cela manque généralement lors de l'analyse HTML DOM.Le problème avec le HTML est que la structure de votre document est tellement variable qu'il est difficile d'en extraire avec précision une précision (et je veux dire 100% de taux de réussite sans faux positif).

Ce que je vous recommande de faire est d'utiliser un analyseur DOM tels que SimpleHTML et l'utiliser comme tel:

require_once('SimpleHTML.class.php') 

$html_dom = str_get_dom($html); 
$tags = $html_dom->find('img.findme'); // Get all img elements of class findme 

Certains peuvent penser que cela est exagéré, mais à la fin, il sera plus facile de maintenir et aussi permet plus d'extensibilité. Par exemple, en utilisant l'analyseur DOM, je peux aussi obtenir l'attribut alt. Une expression régulière pourrait être conçue pour atteindre le même but, mais serait limitée de telle sorte qu'elle forcerait l'attribut alt à être après le src ou le contraire, et surmonter cette limitation ajouterait plus de complexité à la normale. expression.

Considérez également ce qui suit. Pour correspondre correctement une étiquette <img> utilisant des expressions régulières et pour obtenir que l'attribut class (capturé dans le groupe 2), vous devez l'expression régulière suivante:

<\s*img\s+[^>]*?\s*class\s*=\s*(["'])((\\?+.)*?)\1[^>]*?> 

Et là encore, le dessus peut échouer si:

  • L'attribut ou le nom de tag est en majuscule et le modificateur i n'est pas utilisé.
  • Les cotes ne sont pas utilisées autour de l'attribut class.
  • Un autre attribut, puis class utilise le caractère > quelque part dans leur valeur.
  • Une autre raison que je n'ai pas prévue.

Encore une fois, n'utilisez simplement pas d'expressions régulières pour analyser un document dom.

+0

Assez juste. Auparavant, les exigences étaient beaucoup plus simples, donc une regex a bien fonctionné, mais je pense que vous avez raison, c'est hors de la ligue des expressions régulières. – jvenema

2

Regex est un outil extrêmement pauvre pour ce travail. Utilisez un analyseur. Et avant de le faire, exécutez-le via HTML Tidy pour corriger le code HTML invalide. Quel que soit le langage que vous utilisez (vous ne le dites pas), un ou plusieurs analyseurs HTML seront disponibles.

0

Y Vous ne mentionnez pas la langue que vous utilisez, mais vous devriez probablement charger ceci dans un XmlDocument et chercher dans le DOM correctement. Une expression rationnelle correspondra à un modèle, mais vous pourriez obtenir toutes sortes de faux positifs.

+0

Un exemple vaut un +1. – Shanimal

0

Essayer de résoudre ce genre de problème avec des expressions régulières est une recette pour désaster. Si vous travaillez sur le serveur, analysez l'extrait avec un analyseur html tolérant aux pannes (c'est-à-dire hpricot pour ruby) et validez contre le dom. Même chose peut être fait sur le client avec el.innerHTML = "..."

Questions connexes