2029 votes

RegEx match ouvert à l'exception des balises XHTML autonome tags

J'ai besoin de correspondre à tous de ces balises d'ouverture:

<p>
<a href="foo">

Mais pas ces:

<br />
<hr class="foo" />

Je suis venu avec ce et voulait s'assurer que j'ai bien compris. Je ne suis que la capture de l' a-z.

<([a-z]+) *[^/]*?>

Je crois qu'il dit:

  • Trouver un moins-que, puis
  • Trouver (et de capture) de a à z en une ou plusieurs fois, puis
  • Trouvez zéro ou plusieurs espaces, alors
  • Trouvez n'importe quel caractère zéro ou plusieurs fois, gourmand, sauf /, alors
  • Trouver un peu plus de

Dois-je en avoir le droit? Et, plus important encore, qu'en pensez-vous?

4409voto

bobince Points 270740

Vous ne pouvez pas analyser [X]HTML avec des regex. Parce que le HTML ne peut pas être analysé par l'expression régulière. Regex n'est pas un outil qui peut être utilisé pour analyser correctement le HTML. Comme je l'ai répondu en HTML-et-regex questions ici de nombreuses fois auparavant, l'utilisation de regex ne vous permettra pas de consommer de l'HTML. Les expressions régulières sont un outil qui n'est pas suffisamment sophistiqué pour comprendre les constructions employées par HTML. HTML n'est pas un langage régulier et ne peut donc pas être analysée par des expressions régulières. Regex requêtes ne sont pas équipés pour briser HTML en de ses des parties significatives. de nombreuses fois, mais il n'est pas arriver à moi. Même amélioré irrégulière d'expressions régulières utilisées par Perl ne sont pas à la tâche d'analyse syntaxique HTML. Vous n'aurez plus jamais me font craquer. HTML est un langage de suffisamment de complexité qu'il ne peut pas être analysé par des expressions régulières. Même Jon Skeet ne peut pas analyser HTML à l'aide d'expressions régulières. Chaque fois que vous tentez d'analyser HTML avec des expressions régulières, l'impie, l'enfant pleure le sang des vierges, et les pirates russes pwn votre webapp. Analyse HTML avec la regex citation entachée âmes dans le royaume des vivants. HTML et regex vont ensemble comme l'amour, le mariage, et le rituel de l'infanticide. Le <center> ne peut pas tenir, il est trop tard. La force de regex et HTML dans le même espace conceptuel va détruire votre esprit comme autant aqueuse de mastic. Si vous analysez HTML avec la regex vous donner à Eux et leur blasphématoire des moyens qui nous condamne tous à des traitements inhumains labeur pour Celui dont le Nom ne peut pas être exprimée dans le Plan Multilingue de Base, il vient. HTML-plus-regexp va de fluidité nerfs sensibles, tandis que vous observez, votre psyché de flétrissure dans l'assaut de l'horreur. Regex HTML basés sur les analyseurs sont le cancer qui est en train de tuer StackOverflow , il est trop tard il est trop tard, nous ne pouvons être sauvés de la trangession d'un enfant assure la regex va consommer tous les tissus vivants (sauf pour le HTML, il ne peut pas, comme précédemment prophétisé) cher seigneur, aide-nous comment quelqu'un peut-il survivre à ce fléau en utilisant les regex pour analyser HTML a condamné l'humanité à une éternité de l'effroi de la torture et des trous de sécurité à l'aide de regex comme un outil pour traiter HTML établit une breach entre ce monde et l'effroi royaume de la corruption des entités (comme SGML entités, mais plus corrompus) un simple glimpse du monde de regex parseurs HTML sera instantly de transport a programmer de la conscience, jento un world d'incessants cris, il arrive, la pestilence slithy regex infection will dévorer votre HTML analyseur, de l'application et de l'existence pour tous les temps comme Visual Basic mais en pire il vient il comes ne font pas fi gratuiteght he vient, saluts impie radiańcé destro҉ying toutes les lumières, les balises HTML fuite frǫm vos yeux comme liquid pain, la chanson de l'ordinaire expression d'analyse sera extinguish la voix de mortal homme de la spici je peux voir, il peut vous voir ît il est beau til final snuffing of le mensonges de l'Homme TOUT EST LOŚT UNLL EST LOST the poney-ils il comes il a com's til de l'ichou perméates all MA FACE MON VISAGE ᵒh dieu no NON non oOO NΘ arrêt t- il un*gles ͎a̧͈͖r̽̾̈́͒͑e not rèal ZALGΌ EST҉ TOƝȳ THË PONEY HȨ COMȆS


Avez-vous essayé d'utiliser un analyseur XML à la place?


Note du modérateur

Ce post est verrouillé pour empêcher inapproprié des modifications à son contenu. Le post ressemble exactement comme il est censé le regarder - il n'y a pas de problèmes avec son contenu. S'il vous plaît ne pas le signaler à notre attention.

3485voto

S'il est vrai que le fait de poser regexes pour analyser arbitraire HTML, c'est comme demander de Paris Hilton à écrire un système d'exploitation, il est parfois approprié pour analyser un limitées, connu ensemble de HTML.

Si vous avez un petit ensemble de pages HTML que vous souhaitez recueillir des données à partir et ensuite les objets dans une base de données, regexes pourrait fonctionner parfaitement. Par exemple, j'ai récemment voulu obtenir les noms, les parties, et les districts de Australien des Représentants du gouvernement fédéral, qui je suis sur de le site internet du Parlement. C'était un tirage limité, un temps de travail.

Regexes a très bien fonctionné pour moi, et ont été très rapide à mettre en place.

2224voto

NealB Points 11102

Je pense que le problème, ici, c'est que le HTML est une Chomsky Type 2 grammaire (sans contexte la grammaire) et de la RegEx est un Chomsky Type 3 grammaire (grammaire régulière). Depuis un Type 2 de grammaire est fondamentalement plus complexe qu'un Type 3 de grammaire (voir la hiérarchie de Chomsky), on ne peut pas faire ce travail. Mais beaucoup vont essayer, certains disent de succès, et d'autres vont trouver la faille et totalement désordre vous.

1475voto

Justin Morgan Points 12853

N'écoutez pas ces gars-là. En fait vous pouvez analyser le contexte libre de grammaires avec la regex si vous divisez la tâche en petits morceaux. Votre modèle a besoin de faire chacun de ces éléments dans l'ordre:

  1. Résoudre le Problème de l'Arrêt.
  2. Carré un cercle (utiliser la "règle et au compas" méthode pour cela).
  3. Travailler sur le Problème du voyageur de commerce en O(log n). Il doit être rapide ou votre moteur de regex va s'accrocher.
  4. Les résultats seront assez gros, donc assurez-vous d'avoir un autre algorithme qui compresse sans perte de données aléatoires.
  5. On y est presque - il suffit de diviser le tout par zéro. Facile comme bonjour.

Je n'ai pas compris la dernière partie encore, mais il ne devrait pas être dur. Mon code maintient jetant CthulhuRlyehWgahnaglFhtagnExceptions ces derniers temps, donc je suis la mise en place d'un vide catch bloc seulement de consommer ces et garder de l'analyse. Je vais mettre à jour avec le code une fois que j'enquêter sur cette étrange porte qui vient de s'ouvrir dans le mur. Hmm.

Pierre de Fermat a également compris comment le faire, mais la marge qu'il a été écrit en n'était pas assez grand pour le code.

1137voto

itsadok Points 12971

Avertissement: l'utilisation d'un analyseur si vous en avez la possibilité. Cela dit...

C'est la regex que j'utilise (!) pour faire correspondre les balises HTML:

<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>

Il ne peut pas être parfait, mais j'ai couru ce code par le biais d'un lot de HTML. Notez que même les captures des choses étranges comme <a name="badgenerator"">, ce qui s'affichent sur le web.

Je suppose que pour le rendre correspondent pas autonome des balises, vous feriez voulez utiliser Kobi'négatif look-derrière:

<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+(?<!/\s*)>

ou tout simplement se combiner si et si pas.

Pour downvoters: C'est du code qui fonctionne à partir d'un produit réel. Je doute que quelqu'un en lisant cette page, l'impression qu'il est socialement acceptable d'utiliser les regexes sur le code HTML.

Mise en garde: il est à noter que cette regex encore se décompose en présence d'CDATA blocs, des commentaires, et le scénario et les éléments de style. Bonne nouvelle, vous pouvez vous débarrasser de ces à l'aide d'une regex...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X