RegEx wedstrijd geopend tags behalve XHTML zelfstandige labels – Stack Overflow

RegEx wedstrijd geopend tags behalve XHTML zelfstandige labels - Stack Overflow

Je kunt niet ontleden [X] HTML met reguliere expressies. Omdat HTML kan niet worden ontleed door regex. Regex is niet een instrument dat gebruikt kan worden om correct te ontleden HTML. Zoals ik in HTML-en-regex vragen hier zo vele malen eerder hebben beantwoord, zal het gebruik van de reguliere expressie niet mogelijk om HTML verbruikt. Reguliere expressies zijn een instrument dat is onvoldoende verfijnd om de constructen in dienst van HTML te begrijpen. HTML is niet een normale taal en kan daarom niet worden ontleed door reguliere expressies. Regex queries zijn niet uitgerust te breken HTML in zijn betekenisvolle delen. zo vaak, maar het is niet om naar mij. Zelfs verbeterde onregelmatige reguliere expressies zoals gebruikt door Perl worden niet tot de taak van het ontleden van HTML. Je zal nooit me te kraken. HTML is een taal voldoende complex dat niet kan worden geparseerd door reguliere expressies. Zelfs Jon Skeet kan geen HTML ontleden met behulp van reguliere expressies. Elke keer dat u probeert te ontleden HTML met reguliere expressies, de onheilige kind huilt het bloed van maagden, en Russische hackers pwn uw webapp. Het ontleden HTML met reguliere expressies dagvaarding bedorven zielen in het rijk van de levenden. HTML en regex gaan samen als liefde, huwelijk, en rituele kindermoord. De lt; centergt; kan niet in het bezit het te laat is. De kracht van de reguliere expressies en HTML samen in dezelfde conceptuele ruimte zal je geest te vernietigen, zoals zo veel waterige stopverf. Als u HTML met reguliere expressies u geven aan hen en hun godslasterlijke manier die ons allemaal kommer aan onmenselijke arbeid voor degene wiens naam niet kan worden uitgedrukt in de Basic Multilingual Plane ontleden, komt hij. HTML-plus-regexp zal vloeibaar de n erves van de levende, terwijl je waarneemt, je psyche verdorren in de aanval van horror. Regex-gebaseerde HTML parsers zijn de kanker die doodt StackOverflow Het is te laat het te laat is kunnen we niet gered worden de trangession van een kind zorgt ervoor dat reguliere expressie zal alle levend weefsel verbruiken (met uitzondering van de HTML die het niet kan, zoals eerder voorspeld) lieve Heer, help ons hoe kan iemand overleven deze plaag met behulp van reguliere expressies om HTML te ontleden heeft de mensheid gedoemd tot een eeuwigheid van angst marteling en gaten in de beveiliging met behulp van rege x als een instrument om HTML te verwerken wordt een breach tussen deze wereld en de gevreesde rijk van de corrupte entiteiten (zoals SGML entiteiten, maar corrupter) slechts een glimp se van de wereld van de regex parsers voor HTML zal ins tantly vervoeren een programmer bewustzijn i nto een worl d van onophoudelijke schreeuwen, hij komt, de verderfelijke sl ithy regex-infectie will verslinden uw HT ML parser, de toepassing en het bestaan ​​voor alle tijd, zoals Visual Basic alleen maar erger Hij komt hij com es niet fi ght he komt, HI s Unholy Radiance destro҉ying alle verlichting, HTML-tags Lekkende fr̶ǫm YO UR Ogen als liq uid p ain, het lied van de reguliere exp ression parsing zal EXTInguish de stemmen van morTal man uit de sp Hier zie ik het kan je zien dat het mooi is t Hij f inal Snuf fing of de leugens of Man Alles is verloren ALL I S L OST the PONY hij vandaan s Hij komt hij medeme s thij ich of permeates al l MY FACE MY FACE ᵒh god no NEE NOOO O N Θ stop thij * ̶͑̾̾ GL eS zijn Not Real ZA̡͊͠͝LGΌ ISͮ҉̯͈͕̹̘ T O͇̹̺Ɲ̴ȳ̳ thE PO Ny H̸̡̪̯ͨ͊̽̅̾Ȩ̬̩̾͛ͪ̈͘ ̶̧̨̹̭̯ͧ̾ͬC̷̙̝͖ͭ̏ͥͮ͟Oͮ͏̮̪̝͍M̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝

Heb je geprobeerd met behulp van een XML-parser in plaats daarvan?

Dit bericht is vergrendeld om ongepaste bewerkingen te voorkomen dat de inhoud ervan. Het bericht ziet er precies zoals het hoort te kijken – er zijn geen problemen met de inhoud ervan. Gelieve niet de vlag van het voor onze aandacht.

Ik had eens een aantal gegevens af te trekken

10k pagina’s, allemaal met dezelfde HTML-sjabloon. Ze waren bezaaid met HTML fouten die veroorzaakt parsers te stikken, en al hun styling was inline of met lt; fontgt; etc. geen klassen of id’s te helpen navigeren door de DOM. Na het vechten de hele dag met de "rechts" benadering, eindelijk ben ik overgestapt naar een reguliere expressie-oplossing en had het werken in een uur. – Paul A Jungwirth 7 september ’12 op 07:14

Ik denk dat de fout hier is dat HTML is een Chomsky Type 2 grammatica (contextvrije grammatica) en RegEx is een Chomsky Type 3 grammatica (reguliere grammatica). Aangezien een Type 2 grammatica is fundamenteel complexer dan een Type 3 grammatica (zie Chomsky hiërarchie), kun je onmogelijk dit werk te maken. Maar velen zullen proberen, zullen sommige succes claimen en anderen zullen de fout en volstrekt je rotzooi up te vinden.

Het OP vraagt ​​om een ​​zeer beperkte subset van XHTML parsen start markeringen. Wat merken (X) HTML een CFG is zijn potentieel elementen tussen het begin en einde tags van andere elementen (zoals in een grammatica regel A -gt; s A e). (X) HTML doet niet hebben deze woning binnen een start-tag: een start tag kan geen andere start-tags bevatten. De deelverzameling dat het OP probeert te ontleden is geen CFG. – LarsH 2 maart ’12 om 08:43

@eyelidlessness: hetzelfde "alleen als" geldt voor alle CFGs, nietwaar? D.w.z. indien de (X) HTML-ingang is niet goed gevormd, niet eens een full-blown XML parser betrouwbaar werken. Misschien als je voorbeelden van geven "(X) HTML syntax fouten geïmplementeerd in de echte wereld user agents" u verwijst naar, ik begrijp wat je krijgt bij beter. – LarsH 22 mei ’12 op 05:09

@AdamMihalcin Is precies goed. De meeste bestaande reguliere expressies motoren zijn krachtiger dan Chomsky Type 3 grammatica (bijvoorbeeld niet-hebzuchtig matching, backrefs). Sommige regex engines (zoals Perl’s) worden Turing compleet. Het is waar dat zelfs die arm zijn tools voor het ontleden van HTML, maar dit vaak genoemde argument is niet de reden waarom. – dubiousjim 31 mei ’12 op 13:44

Er zijn mensen die zal u vertellen dat de aarde rond is (of misschien dat de Aarde een afgeplatte sferoïde, als ze dat willen vreemde woorden te gebruiken). Ze liegen.

Er zijn mensen die zal u vertellen dat reguliere expressies niet recursieve zou moeten zijn. Ze zijn je te beperken. Zij hebben behoefte aan u onderwerpen, en ze doen het door het houden van u in onwetendheid.

U kunt leven in hun werkelijkheid of neem de rode pil.

Net als de Lord Marshal (is hij een familielid van de maarschalk NET class?), Heb ik de Underverse Stack Based Regex-Vers gezien en kwam terug met bevoegdheden kennis die je kan me niet voorstellen. Ja, ik denk dat er een oude of twee hen te beschermen, maar ze werden voetbal kijken op de tv, dus het was niet moeilijk.

Ik denk dat de XML-zaak is heel simpel. De RegEx (in het .NET syntax), leeggelopen en gecodeerd in base64 om het gemakkelijker te begrijpen door uw zwakke geest, moet iets als dit:

De opties in te stellen is RegexOptions.ExplicitCapture. De capture groep die u zoekt is elementNaam. Als de vangst groep ERROR niet leeg toen was er een fout het ontleden en de Regex gestopt.

Als u problemen omschakeling naar een leesbare reguliere expressie, moet dit helpen:

Als u niet zeker bent, nee, ik ben niet gek (maar misschien dat ik lieg). Het zal werken. Ik heb tonnen unit tests gebouwd om het te testen, en ik heb zelfs gebruikt (een deel van) de conformiteit testen. Het is een tokenizer, niet een volledige geblazen parser, dus het zal alleen maar splitsing van de XML in zijn samenstellende tokens. Het zal niet ontleden / integrate DTD’s.

Oh. Als u wilt dat de broncode van de reguliere expressie, met een aantal ondersteunende methoden:

Good Lord, het is enorm. Mijn grootste vraag is waarom? Je beseft dat alle moderne talen XML parsers, toch? U kunt dat alles in doen, zoals 3 regels en zorg ervoor dat het zal werken. Verder heb je ook realiseren dat pure regex is bewijsbaar niet in staat om bepaalde dingen te doen? Tenzij je een hybride regex / imperatief code parser hebt gemaakt, maar het maakt niet uit als je hebt. Kunt u comprimeren random data ook? – Justin Morgan 8 maart ’11 om 15:23

Ik ben het eens dat de juiste tool om XML te ontleden en in het bijzonder HTML is een parser en niet een reguliere expressie motor. Echter, zoals anderen al hebben opgemerkt, soms met behulp van een reguliere expressie is sneller, eenvoudiger en klaart de klus als je weet dat de data-formaat.

Reguliere expressies hebben wel beperkingen, maar heb je het volgende overwogen?

Het .NET framework is uniek als het gaat om reguliere expressies in dat het ondersteunt Balancing Group definities.

Om deze reden, ik geloof dat je ontleden XML met behulp van reguliere expressies. Merk echter op, dat het moet geldig XML zijn (Browsers zijn erg vergevingsgezind van HTML en laat slechte XML syntax in HTML). Dit is mogelijk omdat de "Balancing Group Definition" kan de reguliere expressie motor om als PDA.

Citaat uit artikel 1 hierboven geciteerd:

.NET Regular Expression Engine

Zoals hierboven goed uitgebalanceerd constructies beschreven kan niet worden beschreven door een reguliere expressie. Echter, de NET reguliere expressie motor levert een aantal constructies die het mogelijk maken evenwichtige constructies om erkend te worden.

  • (? Lt; groupgt;) – duwt de gevangen resultaat op de capture stack met de groepsnaam.
  • (Lt; -groupgt;) – knalt de top de meeste capture met de naam van de groep uit de vangst stack.
  • ((Groeps) ja |? Nee) – overeenkomt met het ja als er een groep met de naam van de groep anders past geen deel bestaat.

Deze constructen zorgen voor een NET reguliere expressie aan een beperkte PDA emuleren door in wezen waardoor eenvoudige versies van de stack operaties: push, pop en leeg. De eenvoudige handelingen zijn vrijwel gelijk aan verhogen, verlagen en te vergelijken met respectievelijk nul. Dit zorgt voor .NET reguliere expressie motor een subset van de context-vrije talen erkennen met name degenen die slechts een eenvoudige teller nodig. Hierdoor kan voor de niet-traditionele NET reguliere expressies afzonderlijke harmonieus constructen herkennen.

Denk aan de volgende reguliere expressie:

  • Enkele lijn
  • IgnorePatternWhitespace (niet nodig als u instorten reguliere expressies en verwijder alle spaties)
  • IgnoreCase (niet noodzakelijk)

Regular Expression Explained (inline)

Ik gebruikte de sample bron van:

Dit vond de wedstrijd:

hoewel het eigenlijk kwam als volgt uit:

Tot slot, ik heb echt genoten van Jeff Atwood’s artikel: Parsing Html De Cthulhu Way. Grappig genoeg, noemt zij het antwoord op deze vraag die op dit moment heeft meer dan 4k stemmen.

Ik wil ontleden HTML met reguliere expressies. Ik probeer niet te idioot HTML die opzettelijk gebroken ontleden. Deze code is mijn belangrijkste parser (Perl edition):

Het heet htmlsplit, splitst de HTML-code in lijnen, met een tag of een stuk tekst op elke regel. De lijnen kunnen dan verder worden verwerkt met andere teksthulpmiddelen en scripts, zoals grep. sed. Perl, enz. Ik ben niet eens een grapje 🙂 Genieten.

Het is eenvoudig genoeg om mijn slurp-alles-eerste Perl-script beter af te stemmen in een leuke streaming ding, als je wilt enorme webpagina’s te verwerken. Maar het is niet echt nodig.

Ik wed dat ik zal krijgen downvoted voor.

Tegen mijn verwachting kreeg dit aantal upvotes, dus ik stel voor wat betere reguliere expressies:

Ze zijn goed voor XML / XHTML.

Met kleine variaties, kan het omgaan met rommelige HTML. of zet de HTML -gt; XHTML eerste.

De beste manier om reguliere expressies te schrijven is in de Lex / Yacc stijl, niet zo ondoorzichtig one-liners of commentaar multi-line monstrositeiten. Ik heb dat hier niet te doen, maar toch; dezen nauwelijks nodig hebben.

Nou, het maakt niet veel uit als de HTML is niet gebroken of niet. Het ding zal nog steeds verdeeld in HTML-tags en tekst. Het enige dat het zou kunnen bevuilen up is als mensen onder onbeschermde lt; of gt; tekens tekst of attributen. In de praktijk is mijn kleine HTML splitter werkt goed. Ik heb geen een enorme gedrocht boordevol heuristiek nodig. Simpele oplossingen zijn niet voor iedereen. – Sam Watkins 8 maart ’12 om 03:22

Hier is de oplossing:

Om het te diep te testen, ging ik in de reeks auto-closing tags zoals:

Ik ging ook tags met:

  1. één attribuut
  2. meerdere attributen
  3. attributen die waarde wordt gebonden, hetzij in enkele aanhalingstekens of in dubbele aanhalingstekens
  4. attributen met enkele aanhalingstekens wanneer de begrenzer is een dubbel aanhalingsteken en vice versa
  5. "unpretty" attributen met een spatie voor de "=" symbool, na en voor en na.

Mocht u iets wat niet werkt in de proof of concept boven vinden, ik ben beschikbaar in het analyseren van de code om mijn vaardigheden te verbeteren.

lt; EDITgt; Ik vergat dat de vraag van de gebruiker is het interpreteren van zelfsluitende tags te voorkomen. In dit geval is het patroon eenvoudiger, veranderen in dit:

De gebruiker @ridgerunner gemerkt dat het patroon niet toestaat niet-beursgenoteerde attributen of attributen zonder waarde. In dit geval brengt een fine tuning ons het volgende patroon:

Inzicht in het patroon

Als iemand geïnteresseerd is in meer te leren over het patroon, geef ik enkele regel:

  1. de eerste sub-expressie (\ w +) overeenkomt met de tagname
  2. de tweede subuitdrukking bevat het patroon van een attribuut. Het bestaat uit:
  1. één of meer spaties \ s +
  2. de naam van het attribuut (\ w +)
  3. nul of meer spaties \ s * (het mogelijk of niet, waardoor blanks hier)
  4. de "=" symbool
  5. nogmaals, nul of meer spaties
  6. de afbakening van het attribuut waarde, een enkele of dubbele aanhalingstekens ( ‘|"). In het patroon, wordt de enkele aanhalingstekens ontsnapte omdat het samenvalt met de PHP string delimiter. Deze sub-expressie wordt vastgelegd met de haakjes, zodat het opnieuw kan worden gerelateerd aan de sluiting van het attribuut ontleden, dat is waarom het is zeer belangrijk.
  7. de waarde van het attribuut, aangevuld met bijna alles:; (*.?) In dit specifieke syntaxis, met het hebzuchtig wedstrijd (Het vraagteken na de asterisk) de RegExp motor maakt een "kijk vooruit"-achtige operator, waarin alles maar wat volgt deze sub-expressie overeenkomt
  8. hier komt het leuke: het \ 4 deel is een terugverwijzing operator. die verwijst naar een sub-expressie voordat gedefinieerd in het patroon, in dit geval Ik verwijs naar de vierde sub-expressie, dat is de eerste attribuut scheidingsteken gevonden
  9. nul of meer spaties \ s *
  10. het attribuut subuitdrukking eindigt hier, met de specificatie van nul of meer mogelijke voorvallen, die door het sterretje.
  • Dan, aangezien een tag kan eindigen met een spatie voor de "gt;" symbool, worden nul of meer spaties gekoppeld aan de \ s * subpatroon.
  • Het label aan te passen kan eindigen met een eenvoudige "gt;" symbool of een eventuele XHTML sluiting, die het gebruik van de slash voordat maakt: (/ gt; | gt;). De slash is natuurlijk ontsnapt, omdat het samenvalt met de reguliere expressie scheidingsteken.
  • Kleine tip: om beter te analyseren deze code is het noodzakelijk te kijken naar de broncode gegenereerd, aangezien ik geen HTML speciale tekens ontsnappen voorzag.

    NO sorry, spaties voordat een tagnaam zijn illegaal. Behalve dat het "vrij zeker" waarom ga je niet bieden een aantal bewijzen van uw bezwaar? Hier zijn de mijne, genoemd w3.org/TR/xml11/#sec-starttags naar XML 1.1, en je kunt hetzelfde voor HTML 4, 5 en XHTML te vinden, als een W3C validatie zou ook waarschuwen als u een test te maken. Als een heleboel andere bla-bla-dichters hier in de buurt, heb ik nog steeds niet ontvangen geen intelligent argumentatie, behalve enkele honderden van min mijn antwoorden, om te laten zien waar mijn code niet volgens de regels van het contract gespecificeerd in de vraag. Ik zou hen alleen maar toejuichen. – Emanuele Del Grande 6 oktober ’13 op 18:03

    Over de kwestie van de RegExp methoden om ontleden (x) HTML, het antwoord op al degenen die over een aantal grenzen sprak is: je hebt niet genoeg om de kracht van dit krachtige wapen regeren opgeleid, aangezien NIEMAND Hier sprak over herhaling .

    Een RegExp-agnostisch collega meegedeeld me deze discussie, dat is niet zeker de eerste op het web over deze oude en hot topic.

    Na het lezen van sommige posten, het eerste wat ik deed was op zoek naar de "? R" koord in deze thread. De tweede was om te zoeken over "herhaling".
    Nee, heilige koe, geen match gevonden.
    Aangezien niemand hebben het belangrijkste mechanisme een parser is gebouwd op, was ik al snel van bewust dat niemand kreeg het punt.

    Als een (x) HTML-parser nodig recursie, een RegExp parser zonder recursie is niet genoeg voor het doel. Het is een eenvoudige constructie.

    De zwarte kunst van RegExp is moeilijk te beheersen. dus misschien zijn er nog meer mogelijkheden we weggelaten terwijl het proberen en testen van onze eigen oplossing voor de hele webpagina vast te leggen in één hand. Nou, ik ben er zeker van 🙂

    Hier is de magie patroon:

    Probeer het gewoon.
    Het is geschreven als een PHP string, zodat de "s" modifier maakt klassen zijn nieuwe regels.
    Hier is een monster nota over de PHP handleiding Ik schreef op Januari: Reference

    (Let op, in deze nota ik ten onrechte gebruik gemaakt van de "m" modifier; het moet worden gewist, niettegenstaande het wordt weggegooid door de RegExp motor, omdat er geen ^ of $ ankerplaats werd gebruikt).

    Nu, we kunnen spreken over de grenzen van deze methode vanuit een meer weloverwogen standpunt:

    1. volgens de specifieke uitvoering van de RegExp motor kan recursie limiet in het hebben aantal geneste patronen ontleed. maar het hangt af van de gebruikte taal
    2. hoewel bedorven (x) HTML rijdt niet in ernstige fouten, is het niet opgeschoond.

    Hoe dan ook het is slechts een RegExp patroon, maar het beschrijft de mogelijkheid voor de ontwikkeling van veel krachtigere versies.
    Ik schreef dit patroon aan de recursieve afdaling parser van een template engine bouwde ik in mijn kader van stroom, en optredens zijn echt geweldig, zowel in de uitvoeringstermijnen of geheugengebruik (niets te maken met andere template motoren die dezelfde syntax te gebruiken).

    Reguliere expressies kunnen niet werken omdat per definitie niet recursief. Het toevoegen van een recursieve operator om reguliere expressies in principe maakt een CFG alleen met een slechtere syntax. Waarom niet iets ontworpen recursieve in de eerste plaats om te zijn in plaats van geweld te voegen recursie in iets al vol met vreemde functionaliteit gebruiken? – Welbog 6 juli ’10 om 18:38

    Ik schreef onlangs een HTML ontsmettingsmiddel in Java. Het is gebaseerd op een gemengde aanpak van reguliere expressies en Java-code. Persoonlijk heb ik een hekel aan reguliere expressies en de dwaasheid (leesbaarheid, onderhoudbaarheid, etc.), maar als je de omvang van de toepassingen te verminderen kan het past bij uw behoeften. Hoe dan ook, mijn ontsmettingsmiddel maakt gebruik van een witte lijst voor de HTML-tags en een zwarte lijst voor een aantal stijlkenmerken.

    Voor uw gemak heb ik het opzetten van een speeltuin, zodat u kunt testen of de code overeenkomt met uw eisen: speeltuin en Java-code. Uw feedback zal worden gewaardeerd.

    Er is een klein artikel over dit werk op mijn blog: http://roberto.open-lab.com

    Het is waar dat bij de programmering is het meestal het beste om dedicated parsers en API’s in plaats van reguliere expressies te gebruiken in de omgang met HTML, vooral als de nauwkeurigheid van het grootste belang (bijvoorbeeld als uw verwerking gevolgen voor de veiligheid zou kunnen hebben). Echter, ik denk niet toe te schrijven aan een dogmatische opvatting dat XML-stijl markup nooit mag worden verwerkt met reguliere expressies. Er zijn gevallen waarin reguliere expressies zijn een geweldig hulpmiddel voor de baan, zoals bij het maken van eenmalige bewerkingen in een teksteditor, vaststelling gebroken XML-bestanden, of omgaan met bestandsformaten die eruit zien als maar zijn niet helemaal XML. Er zijn een aantal zaken bewust te zijn van, maar ze zijn niet onoverkomelijk, of zelfs per se relevant.

    Een eenvoudige regex zoals lt; ([^ gt;"’] |"[^"] *"| ‘[^] *’) * Gt; is meestal goed genoeg is, in gevallen zoals die ik zojuist noemde. Het is een naïef oplossing, alles bij elkaar genomen, maar het doet correct mogelijk ongecodeerde gt; symbolen attribuutwaarden. Als u op zoek bent naar, bijv. een tafel tag, kun je het aan te passen als lt;? / table \ b ([^ gt;"’] |"[^"] *"| ‘[^] *’) * Gt; .

    Gewoon om een ​​gevoel van wat een meer geven "vergevorderd" HTML reguliere expressie zou uitzien, het volgende doet een tamelijk respectabele job emuleren real-world browser gedrag en de HTML5 het ontleden algoritme:

    De volgende overeenkomt met een vrij strikte definitie van XML-tags (hoewel het niet goed zijn voor de volledige set van Unicode-tekens toegestaan ​​in XML namen):

    Toegegeven, deze niet goed zijn voor de omliggende context en een paar extreme gevallen, maar zelfs zulke dingen kunnen worden behandeld als je echt wilde (bijv. Door te zoeken tussen de wedstrijden van een andere regex).

    Aan het eind van de dag, maken gebruik van de tool voor de job, zelfs in de gevallen waarin het werktuig toevallig een reguliere expressie zijn.

    2016 Stack Exchange, Inc

    Bron: stackoverflow.com

    Geef een reactie

    Het e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

    vijf × vijf =