Vous ne pouvez pas analyser [X] HTML avec regex. Parce que HTML ne peut pas être analysé par regex. Regex n'est pas un outil qui peut être utilisé pour analyser correctement le HTML. Comme j'ai déjà répondu à de nombreuses questions sur HTML et regex ici, l'utilisation de regex ne vous permettra pas de consommer du HTML. Les expressions régulières sont un outil qui n'est pas suffisamment sophistiqué pour comprendre les constructions employées par HTML. Le HTML n'est pas un langage régulier et ne peut donc pas être analysé par des expressions régulières. Les requêtes Regex ne sont pas équipées pour décomposer le HTML en ses parties significatives. tant de fois mais ça ne m'arrive pas. Même les expressions régulières irrégulières améliorées utilisées par Perl ne sont pas à la hauteur de l'analyse syntaxique de HTML. Tu ne me feras jamais craquer. Le HTML est un langage d'une complexité suffisante pour qu'il ne puisse pas être analysé par des expressions régulières. Même Jon Skeet ne peut pas analyser le HTML à l'aide d'expressions régulières. Chaque fois que vous essayez d'analyser le HTML avec des expressions régulières, l'enfant impie pleure le sang des vierges et les pirates russes pwn votre webapp. Analyser le HTML avec des expressions régulières invoque des âmes entachées dans le domaine des vivants. HTML et regex vont de pair comme l'amour, le mariage et l'infanticide rituel. Le <center> ne peut pas le retenir, il est trop tard. La force de l'expression rationnelle et du HTML ensemble dans le même espace conceptuel détruira votre esprit comme autant de mastic aqueux. Si vous analysez HTML avec des expressions rationnelles, vous les cédez et leurs manières blasphématoires qui nous condamnent tous à un travail inhumain pour Celui dont le nom ne peut pas être exprimé dans le plan multilingue de base, il vient. HTML-plus-regexp liquéfiera les nerfs du sensible pendant que vous observez, votre psyché se flétrir dans l'assaut de l'horreur.il est trop tard, il est trop tard, nous ne pouvons pas être sauvés la transition d'un enfant garantit que regex consommera tous les tissus vivants (à l'exception du HTML qu'il ne peut pas, comme précédemment prophétisé) cher seigneur nous aider comment quelqu'un peut-il survivre à ce fléau en utilisant regex pour analyser Le HTML a condamné l'humanité à une éternité de torture et de trous de sécurité effrayants en utilisant rege x comme un outil pour traiter HTML établit une rupture entre ce monde et le royaume de l'effroi d'entités c͒ͪo͛ͫrrupt (comme les entités SGML, mais plus corrompu) un simple aperçu de le monde de reg ex parseurs pour HTML ins tantly transports ap conscience de rogrammer i nto aw orl d de cris incessants, il vient, le pestilentielle slITHY regex-infection wil l dévorent votre HT analyseur ML, l' application et l' existence de tous les temps comme Visual Basic ne fait qu'empirer viendra , il com es ne pas fi ght h e VIENT, salut s Unholy Radiance de stro҉ying toute lumière, HTML balises fuite fr̶ǫm areil Liq EYES comme uid p ain, la chanson de RÉGULIER exp re analyse syntaxique ssion va ExtJ nguish les voix de mor homme tal de la sp ici , je peux le voir peut vous le voyez , il est beau t - il f inal snuf
Fing o f le mensonge de l' homme TOUT EST PERDU A LL I SL e PONY il vientOST e s il cơm es il co me s t - il ich ou Permeat es al l MON FAC de E MON VISAGE dieu n o NO Noo O ON Θ arrêt t - il un * ̶͑̾̾ Gl ÉS ͎a̧͈͖r̽̾̈́͒͑e
n ot RÉAL ZA̡͊͠͝LGΌ ISͮ҉̯͈͕̹̘ T O͇̹̺ͅƝ̴ȳ̳ TH̘ Ë͖́̉ ͠P̯͍̭O̚ N̐Y̡ H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈́̀́͘ ̶̧̨̱̹̭̯ͧ̾ͬC̷̙̲̝͖ͭ̏ͥͮ͟Oͮ͏̮̪̝͍M̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝ S̨̥̫͎̭ͯ̿̔̀ͅ
Avez-vous essayé d'utiliser un analyseur XML à la place?
Note du modérateur
Ce message est verrouillé pour empêcher toute modification inappropriée de son contenu. La publication ressemble exactement à ce qu'elle est censée ressembler - il n'y a aucun problème avec son contenu. Veuillez ne pas le signaler à notre attention.
Bien qu'un HTML arbitraire avec seulement une expression régulière soit impossible, il est parfois approprié de les utiliser pour analyser un ensemble limité et connu de HTML.
Si vous disposez d'un petit ensemble de pages HTML à partir desquelles vous souhaitez extraire des données, puis les insérer dans une base de données, les expressions régulières peuvent fonctionner correctement. Par exemple, j'ai récemment voulu obtenir les noms, les partis et les districts des représentants fédéraux australiens, que j'ai retirés du site Web du Parlement. Il s'agissait d'un travail limité et ponctuel.
Les regex fonctionnaient très bien pour moi et étaient très rapides à mettre en place.
la source
&foo;
encodages et lesCDATA
sections? Vous utilisez un minifieur HTML pour supprimer tous les espaces de votre document que le navigateur ne rend pas? Un analyseur XML ne s'en souciera pas, pas plus qu'une déclaration XPath bien écrite. Un "analyseur" basé sur les regex, d'autre part ...<font>
etc.: aucune classe ou ID pour aider à naviguer dans le DOM. Après avoir combattu toute la journée avec la "bonne" approche, je suis finalement passé à une solution regex et l'ai fait fonctionner en une heure.Je pense que le défaut ici est que HTML est une grammaire Chomsky Type 2 (grammaire sans contexte) et RegEx est une grammaire Chomsky Type 3 (grammaire régulière) . Puisqu'une grammaire de type 2 est fondamentalement plus complexe qu'une grammaire de type 3 (voir la hiérarchie Chomsky ), il est mathématiquement impossible d'analyser XML avec RegEx.
Mais beaucoup essaieront, certains revendiqueront même le succès - mais jusqu'à ce que d'autres trouvent la faute et vous gâchent totalement.
la source
A -> s A e
). (X) HTML n'a pas cette propriété dans une balise de démarrage: une balise de démarrage ne peut pas contenir d'autres balises de démarrage. Le sous-ensemble que l'OP essaie d'analyser n'est pas un CFG.N'écoutez pas ces gars. Vous pouvez totalement analyser des grammaires sans contexte avec regex si vous divisez la tâche en petits morceaux. Vous pouvez générer le modèle correct avec un script qui fait chacun de ces éléments dans l'ordre:
Je n'ai pas tout à fait fini la dernière partie moi-même, mais je sais que je m'approche. Il continue de lancer des
CthulhuRlyehWgahnaglFhtagnException
s pour une raison quelconque, donc je vais le porter sur VB 6 et l'utiliserOn Error Resume Next
. Je mettrai à jour le code une fois que j'aurai enquêté sur cette étrange porte qui vient de s'ouvrir dans le mur. Hmm.Le PS Pierre de Fermat a également compris comment le faire, mais la marge dans laquelle il écrivait n'était pas assez grande pour le code.
la source
Avertissement : utilisez un analyseur si vous en avez la possibilité. Cela dit...
Voici l'expression régulière que j'utilise (!) Pour faire correspondre les balises HTML:
Ce n'est peut-être pas parfait, mais j'ai exécuté ce code à travers beaucoup de code HTML. Notez qu'il capture même des choses étranges comme
<a name="badgenerator"">
, qui apparaissent sur le Web.Je suppose que pour qu'il ne corresponde pas aux balises autonomes, vous souhaitez soit utiliser le look- back négatif de Kobi :
ou combinez simplement si et sinon.
Pour les downvoters: il s'agit du code de travail d'un produit réel. Je doute que tous ceux qui liront cette page auront l'impression qu'il est socialement acceptable d'utiliser des expressions rationnelles sur HTML.
Avertissement : je dois noter que cette expression régulière se décompose toujours en présence de blocs CDATA, de commentaires et d'éléments de script et de style. La bonne nouvelle est que vous pouvez vous débarrasser de ceux qui utilisent une expression régulière ...
la source
<!doctype html><title><</title>
. Les'<!doctype html><title><</title>'.match(/<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>/g)
retours simples["<!doctype html>", "<title>", "<</title>"]
tout en devraient["<title>", "</title>"]
.Il y a des gens qui vous diront que la Terre est ronde (ou peut-être que la Terre est une sphéroïde oblate s'ils veulent utiliser des mots étranges). Ils mentent.
Il y a des gens qui vous diront que les expressions régulières ne doivent pas être récursives. Ils vous limitent. Ils ont besoin de vous soumettre, et ils le font en vous gardant dans l'ignorance.
Vous pouvez vivre dans leur réalité ou prendre la pilule rouge.
Comme Lord Marshal (est-il un parent de la classe Marshal .NET?), J'ai vu le verset Regex basé sur la pile
Underverseet je suis revenu avec des connaissances enpouvoirs quevous ne pouvez pas imaginer. Oui, je pense qu'il y en avait un ou deux qui les protégeaient, mais ils regardaient le football à la télé, donc ce n'était pas difficile.Je pense que le cas XML est assez simple. Le RegEx (dans la syntaxe .NET), dégonflé et codé en base64 pour le rendre plus facile à comprendre par votre faible esprit, devrait ressembler à ceci:
Les options à définir sont
RegexOptions.ExplicitCapture
. Le groupe de capture que vous recherchez estELEMENTNAME
. Si le groupe de captureERROR
n'est pas vide, il y a eu une erreur d'analyse et le regex s'est arrêté.Si vous avez des problèmes pour le reconvertir en expression régulière lisible par l'homme, cela devrait vous aider:
Si vous n'êtes pas sûr, non, je ne plaisante pas (mais peut-être que je mens). Ça va marcher. J'ai construit des tonnes de tests unitaires pour le tester, et j'ai même utilisé (une partie des) tests de conformité . C'est un tokenizer, pas un analyseur complet, il ne divisera que le XML en ses jetons de composant. Il n'analysera / n'intégrera pas les DTD.
Oh ... si vous voulez le code source de l'expression régulière, avec quelques méthodes auxiliaires:
regex pour tokenize un xml ou le regex ordinaire complet
la source
Dans le shell, vous pouvez analyser HTML en utilisant sed :
Connexes (pourquoi vous ne devriez pas utiliser la correspondance d'expression régulière):
la source
Je conviens que le bon outil pour analyser XML et en particulier HTML est un analyseur et non un moteur d'expression régulière. Cependant, comme d'autres l'ont souligné, l'utilisation d'une expression régulière est parfois plus rapide, plus facile et fait le travail si vous connaissez le format des données.
Microsoft a en fait une section des meilleures pratiques pour les expressions régulières dans le .NET Framework et parle spécifiquement de considérer [ing] la source d'entrée .
Les expressions régulières ont des limites, mais avez-vous pensé aux points suivants?
Le framework .NET est unique en ce qui concerne les expressions régulières en ce qu'il prend en charge l' équilibrage des définitions de groupe .
Pour cette raison, je crois que vous POUVEZ analyser XML en utilisant des expressions régulières. Notez cependant qu'il doit s'agir de XML valide (les navigateurs sont très indulgents envers HTML et autorisent une mauvaise syntaxe XML dans HTML ). Cela est possible car la "définition du groupe d'équilibrage" permettra au moteur d'expression régulière d'agir comme un PDA.
Citation de l'article 1 cité ci-dessus:
Considérez l'expression régulière suivante:
Utilisez les drapeaux:
Expression régulière expliquée (en ligne)
Vous pouvez l'essayer sur A Better .NET Regular Expression Tester .
J'ai utilisé la source d'échantillon de:
Cela a trouvé le match:
bien qu'il soit sorti comme ceci:
Enfin, j'ai vraiment apprécié l'article de Jeff Atwood: Parsing Html The Cthulhu Way . Assez drôle, il cite la réponse à cette question qui compte actuellement plus de 4k votes.
la source
System.Text
ne fait pas partie de C #. Cela fait partie de .NET.(?=<ul\s*id="matchMe"\s*type="square"\s*>) # match start with <ul id="matchMe"...
), entre "<ul" et "id" devrait être\s+
, non\s*
, sauf si vous voulez qu'il corresponde à <ulid = ...;)\s+
au lieu de\s*
.<img src="images/pic.jpg" />
/
quelque part à l'intérieur qui a échoué pour votre<img src="images/pic.jpg" />
html.Je suggère d'utiliser QueryPath pour analyser XML et HTML en PHP. C'est à peu près la même syntaxe que jQuery, seulement c'est du côté serveur.
la source
Bien que les réponses que vous ne pouvez pas analyser HTML avec des expressions rationnelles soient correctes, elles ne s'appliquent pas ici. L'OP veut juste analyser une balise HTML avec des expressions rationnelles, et c'est quelque chose qui peut être fait avec une expression régulière.
Le regex suggéré est faux, cependant:
Si vous ajoutez quelque chose au regex, en faisant un retour en arrière, il peut être forcé de faire correspondre des choses idiotes comme
<a >>
,[^/]
est trop permissif. Notez également que<space>*[^/]*
c'est redondant, car le[^/]*
peut également correspondre à des espaces.Ma suggestion serait
Où
(?<! ... )
est (dans les expressions rationnelles de Perl) le regard négatif derrière. Il lit "un <, puis un mot, puis tout ce qui n'est pas un>, dont le dernier peut ne pas être un /, suivi de>".Notez que cela permet des choses comme
<a/ >
(tout comme l'expression régulière originale), donc si vous voulez quelque chose de plus restrictif, vous devez créer une expression régulière pour correspondre aux paires d'attributs séparées par des espaces.la source
>
caractère. Je suis d' accord que OP suggère peut être fait avec une expression régulière, mais celui présenté ici est loin de simpliste.Essayer:
Il est similaire au vôtre, mais le dernier
>
ne doit pas être après une barre oblique, et accepte égalementh1
.la source
>
symbole était correctement échappé à & gt ;.>
est valide dans une valeur d'attribut. En effet, dans la sérialisation «XML canonique», vous ne devez pas utiliser>
. (Ce qui n'est pas tout à fait pertinent, sauf pour souligner que>
dans un attribut, la valeur n'est pas du tout une chose inhabituelle.)<div title="this tag is a <div></div>">hello</div>
Sun Tzu, ancien stratège chinois, général et philosophe, a déclaré:
Dans ce cas, votre ennemi est HTML et vous êtes vous-même ou regex. Vous pourriez même être Perl avec une expression régulière irrégulière. Connaissez le HTML. Se connaitre.
J'ai composé un haïku décrivant la nature du HTML.
J'ai également composé un haïku décrivant la nature des regex en Perl.
la source
Production:
Fondamentalement, il suffit de définir les noms de nœuds d'éléments qui se ferment automatiquement, de charger toute la chaîne html dans une bibliothèque DOM, de saisir tous les éléments, de les parcourir et de filtrer ceux qui ne se ferment pas automatiquement et de les opérer.
Je suis sûr que vous savez déjà que vous ne devez pas utiliser l'expression régulière à cette fin.
la source
NS
et spécifiez l'espace de noms.Je ne connais pas votre besoin exact pour cela, mais si vous utilisez également .NET, ne pourriez-vous pas utiliser Html Agility Pack ?
Extrait:
la source
Vous voulez que le premier
>
ne soit pas précédé d'un/
. Regardez ici pour plus de détails sur la façon de procéder. C'est ce qu'on appelle le lookbehind négatif.Cependant, une implémentation naïve de cela finira par correspondre
<bar/></foo>
dans cet exemple de documentPouvez-vous fournir un peu plus d'informations sur le problème que vous essayez de résoudre? Parcourez-vous les balises par programme?
la source
Le W3C explique l'analyse syntaxique sous une forme pseudo-regexp:
Lien W3C
Suivez les liens var pour
QName
,S
etAttribute
pour obtenir une image plus claire.Sur cette base, vous pouvez créer une assez bonne expression rationnelle pour gérer des choses telles que la suppression des balises.
la source
Si vous en avez besoin pour PHP:
Les fonctions PHP DOM ne fonctionneront pas correctement sauf si elles sont correctement formatées en XML. Peu importe à quel point leur utilisation est meilleure pour le reste de l'humanité.
simplehtmldom est bon, mais je l'ai trouvé un peu bogué, et il est assez lourd en mémoire [Va planter sur les grandes pages.]
Je n'ai jamais utilisé querypath , je ne peux donc pas commenter son utilité.
Un autre à essayer est mon DOMParser qui est très léger sur les ressources et que j'utilise avec bonheur depuis un certain temps. Simple à apprendre et puissant.
Pour Python et Java, des liens similaires ont été publiés.
Pour les downvoters - je n'ai écrit ma classe que lorsque les analyseurs XML se sont révélés incapables de résister à une utilisation réelle. La rétrogradation religieuse empêche simplement la publication de réponses utiles - gardez les choses en perspective, s'il vous plaît.
la source
Voici la solution:
Pour le tester en profondeur, j'ai entré dans la chaîne des balises à fermeture automatique comme:
J'ai également entré des balises avec:
Si vous trouvez quelque chose qui ne fonctionne pas dans la preuve de concept ci-dessus, je suis disponible pour analyser le code afin d'améliorer mes compétences.
<EDIT> J'ai oublié que la question de l'utilisateur était d'éviter l'analyse des balises à fermeture automatique. Dans ce cas, le modèle est plus simple, se transformant en ceci:
L'utilisateur @ridgerunner a remarqué que le modèle n'autorise pas les attributs non cotés ou les attributs sans valeur . Dans ce cas, un réglage fin nous apporte le modèle suivant:
</EDIT>
Comprendre le modèle
Si quelqu'un est intéressé à en savoir plus sur le modèle, je fournis une ligne:
Petit conseil: pour mieux analyser ce code il faut regarder le code source généré puisque je n'ai pas fourni de caractères HTML spéciaux s'échappant.
la source
<option selected>
. Ne correspond pas non plus aux balises valides avec des valeurs d'attribut non citées, c'est-à-dire<p id=10>
.< a href="http://wtf.org" >
je suis presque sûr que c'est légal, mais vous ne le faites pas.Chaque fois que j'ai besoin d'extraire rapidement quelque chose d'un document HTML, j'utilise Tidy pour le convertir en XML, puis j'utilise XPath ou XSLT pour obtenir ce dont j'ai besoin. Dans votre cas, quelque chose comme ceci:
la source
J'ai utilisé un outil open source appelé HTMLParser auparavant. Il est conçu pour analyser HTML de diverses manières et sert très bien le but. Il peut analyser HTML en tant que treenode différent et vous pouvez facilement utiliser son API pour extraire des attributs du nœud. Vérifiez-le et voyez si cela peut vous aider.
la source
J'aime analyser HTML avec des expressions régulières. Je n'essaie pas d'analyser un idiot HTML qui est délibérément cassé. Ce code est mon analyseur principal (édition Perl):
Cela s'appelle htmlsplit, divise le code HTML en lignes, avec une balise ou un morceau de texte sur chaque ligne. Les lignes peuvent ensuite être traitées avec d'autres outils de texte et scripts, tels que grep , sed , Perl, etc. Je ne plaisante même pas :) Profitez-en.
Il est assez simple de reconstituer mon script Perl slurp-everything-first en une belle chose en streaming, si vous souhaitez traiter d'énormes pages Web. Mais ce n'est pas vraiment nécessaire.
Je parie que je vais voter pour cela.
Fractionnement HTML
Contre mes attentes, cela a eu quelques votes positifs, je vais donc suggérer de meilleures expressions régulières:
Ils sont bons pour XML / XHTML.
Avec des variations mineures, il peut faire face au HTML désordonné ... ou convertir le HTML -> XHTML en premier.
La meilleure façon d'écrire des expressions régulières est dans le style Lex / Yacc , pas sous forme de lignes simples opaques ou de monstruosités multilignes commentées. Je n'ai pas encore fait ça ici; ceux-ci en ont à peine besoin.
la source
/(\w+)="(.*?)"/
suppose des guillemets doubles. Il manquera des valeurs entre guillemets simples. Dans la version html 4 et les versions antérieures, les valeurs sans guillemets sont autorisées, s'il s'agit d'un simple mot./(\w+)="(.*?)"/
peut correspondre faussement au texte qui ressemble à un attribut dans un attribut, par exemple<img title="Nope down='up' for aussies" src="..." />
. S'il est appliqué globalement, il correspondra également à de telles choses dans du texte ordinaire ou dans des commentaires html.Voici un analyseur basé sur PHP qui analyse le HTML en utilisant une expression rationnelle impie. En tant qu'auteur de ce projet, je peux vous dire qu'il est possible d'analyser HTML avec regex, mais pas efficace. Si vous avez besoin d'une solution côté serveur (comme je l'ai fait pour mon plugin WordPress wp-Typography ), cela fonctionne.
la source
Il y a quelques jolies expressions rationnelles pour remplacer HTML par BBCode ici . Pour tous ceux qui ne disent rien, notez qu'il n'essaie pas d'analyser complètement le HTML, juste de le désinfecter. Il peut probablement se permettre de tuer des balises que son simple "analyseur" ne peut pas comprendre.
Par exemple:
la source
À propos de la question des méthodes RegExp pour analyser (x) HTML, la réponse à tous ceux qui ont parlé de certaines limites est: vous n'avez pas été suffisamment formé pour gouverner la force de cette arme puissante, puisque NOBODY ici a parlé de récursivité .
Un collègue RegExp-agnostic m'a informé de cette discussion, qui n'est certainement pas la première sur le Web à propos de ce sujet ancien et brûlant.
Après avoir lu certains articles, la première chose que j'ai faite a été de rechercher la chaîne "? R" dans ce fil. La seconde consistait à rechercher «récursivité».
Non, vache sacrée, aucune correspondance trouvée.
Comme personne n'a mentionné le mécanisme principal sur lequel un analyseur est construit, j'ai vite compris que personne n'avait compris.
Si un analyseur (x) HTML a besoin d'une récursivité, un analyseur RegExp sans récursivité n'est pas suffisant à cet effet. C'est une construction simple.
L' art noir de RegExp est difficile à maîtriser , alors peut-être qu'il y a d'autres possibilités que nous avons laissées en essayant et testant notre solution personnelle pour capturer le Web entier dans une main ... Eh bien, j'en suis sûr :)
Voici le schéma magique:
Essayez-le.
Il est écrit comme une chaîne PHP, donc le modificateur "s" fait que les classes incluent des sauts de ligne.
Voici un exemple de note sur le manuel PHP que j'ai écrit en janvier: Référence
(Attention, dans cette note, j'ai utilisé à tort le modificateur "m"; il doit être effacé, bien qu'il soit rejeté par le moteur RegExp, car aucun ancrage ^ ou $ n'a été utilisé).
Maintenant, nous pourrions parler des limites de cette méthode d'un point de vue plus éclairé:
Quoi qu'il en soit, ce n'est qu'un modèle RegExp, mais il révèle la possibilité de développer de nombreuses implémentations puissantes.
J'ai écrit ce modèle pour alimenter l' analyseur de descente récursive d'un moteur de modèle que j'ai construit dans mon framework, et les performances sont vraiment excellentes, à la fois en temps d'exécution ou en utilisation de mémoire (rien à voir avec d'autres moteurs de modèle qui utilisent la même syntaxe).
la source
Comme de nombreuses personnes l'ont déjà souligné, le HTML n'est pas un langage standard, ce qui peut le rendre très difficile à analyser. Ma solution à cela est de le transformer en un langage normal à l'aide d'un programme bien rangé, puis d'utiliser un analyseur XML pour consommer les résultats. Il y a beaucoup de bonnes options pour cela. Mon programme est écrit en utilisant Java avec la bibliothèque jtidy pour transformer le HTML en XML puis Jaxen en xpath en résultat.
la source
Les parties ont expliqué:
<
: caractère de départ\s*
: il peut avoir des espaces avant le nom du tag (laid mais possible).(\w+)
: les balises peuvent contenir des lettres et des chiffres (h1). Eh bien,\w
correspond également à «_», mais cela ne fait pas de mal, je suppose. Si vous êtes curieux, utilisez plutôt [[a-zA-Z0-9] +).[^/>]*
: tout sauf>
et/
jusqu'à la fermeture>
>
: fermeture>
NON RELIÉ
Et aux boursiers qui sous-estiment les expressions régulières en disant qu'elles ne sont aussi puissantes que les langues régulières:
un n ba n ba n qui n'est pas régulier et même sans contexte, peut être associé à
^(a+)b\1b\1$
Référence arrière FTW !
la source
O(MN)
(M étant la longueur de l'expression régulière, N étant la longueur du texte). Les références arrières sont l'une des causes de cela. L'implémentation dans awk n'a pas de références et correspond à tout dans leO(MN)
temps.Si vous essayez simplement de trouver ces balises (sans ambitions d'analyse), essayez cette expression régulière:
Je l'ai écrit en 30 secondes et testé ici: http://gskinner.com/RegExr/
Il correspond aux types de balises que vous avez mentionnés, tout en ignorant les types que vous avez dit que vous vouliez ignorer.
la source
\/>
au lieu de\\>
.\>
ce que je voulais dire; Je n'ai jamais voulu modifier l'expression régulière de mon message d'origine.\/
, car cela ferait exactement le contraire des exigences. Peut-être que je pensais que vous proposiez un modèle de filtre négatif.Il me semble que vous essayez de faire correspondre les balises sans "/" à la fin. Essaye ça:
la source
Il est vrai que lors de la programmation, il est généralement préférable d'utiliser des analyseurs et des API dédiés au lieu d'expressions régulières lorsqu'il s'agit de HTML, en particulier si la précision est primordiale (par exemple, si votre traitement peut avoir des implications sur la sécurité). Cependant, je n'attribue pas une vue dogmatique selon laquelle le balisage de style XML ne devrait jamais être traité avec des expressions régulières. Il y a des cas où les expressions régulières sont un excellent outil pour le travail, comme lorsque vous effectuez des modifications ponctuelles dans un éditeur de texte, réparez des fichiers XML cassés ou traitez des formats de fichiers qui ressemblent mais ne sont pas tout à fait XML. Il y a certains problèmes à prendre en compte, mais ils ne sont pas insurmontables ni même nécessairement pertinents.
Un simple regex comme
<([^>"']|"[^"]*"|'[^']*')*>
est généralement suffisant, dans des cas comme ceux que je viens de mentionner. C'est une solution naïve, tout bien considéré, mais elle autorise correctement les>
symboles non codés dans les valeurs d'attribut. Si vous cherchez, par exemple, unetable
balise, vous pouvez l'adapter en tant que</?table\b([^>"']|"[^"]*"|'[^']*')*>
.Juste pour donner une idée de ce à quoi ressemblerait une expression rationnelle HTML plus "avancée", ce qui suit fait un travail assez respectable d'émulation du comportement du navigateur réel et de l'algorithme d'analyse HTML5:
Ce qui suit correspond à une définition assez stricte des balises XML (bien qu'elle ne prenne pas en compte l'ensemble complet des caractères Unicode autorisés dans les noms XML):
Certes, ceux-ci ne tiennent pas compte du contexte environnant et de quelques cas marginaux, mais même de telles choses pourraient être traitées si vous le vouliez vraiment (par exemple, en recherchant entre les correspondances d'une autre expression régulière).
À la fin de la journée, utilisez l'outil le plus approprié pour le travail, même dans les cas où cet outil se trouve être une expression régulière.
la source
Bien qu'il ne soit pas approprié et efficace d'utiliser des expressions régulières à cette fin, les expressions régulières fournissent parfois des solutions rapides aux problèmes de correspondance simples et, à mon avis, ce n'est pas horrible d'utiliser des expressions régulières pour des travaux triviaux.
Il y a un article de blog définitif sur la correspondance des éléments HTML les plus internes écrits par Steven Levithan.
la source