RegEx zodpovedá otvoreným značkám okrem samostatných značiek XHTML

Potrebujem zladiť všetky tieto úvodné značky:

<p>
<a href="foo">

Ale nie tieto:

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

Prišiel som na to a chcel som sa uistiť, že som to pochopil správne. Zachytávam len a-z.

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

Myslím, že sa tam píše:

  • Nájdite menšie ako, potom
  • Nájsť (a zachytiť) a-z jeden alebo viac krát, potom
  • Nájsť nulu alebo viac medzier, potom
  • Nájsť ľubovoľný znak nula alebo viac krát, chamtivý, okrem /, potom
  • Nájsť väčšiu ako

Mám to správne? A čo je dôležitejšie, čo si myslíte?

Riešenie

Nemôžete analyzovať [X]HTML pomocou regexu. Pretože HTML sa nedá analyzovať regexom. Regex nie je nástroj, ktorý sa dá použiť na správne analyzovanie HTML. Ako som tu už mnohokrát odpovedal v otázkach týkajúcich sa HTML a regexu, použitie regexu vám neumožní konzumovať HTML. Regulárne výrazy sú nástrojom, ktorý nie je dostatočne sofistikovaný na pochopenie konštrukcií používaných v jazyku HTML. HTML nie je regulárny jazyk, a preto ho nemožno analyzovať pomocou regulárnych výrazov. Regexové dotazy nie sú vybavené na rozklad HTML na jeho zmysluplné časti. toľkokrát, ale nedá mi to. Dokonca ani rozšírené nepravidelné regulárne výrazy, aké používa Perl, nezvládajú úlohu rozboru jazyka HTML. Nikdy ma nedonútite, aby som sa zlomil. HTML je dostatočne zložitý jazyk na to, aby sa nedal analyzovať regulárnymi výrazmi. Dokonca ani Jon Skeet nedokáže analyzovať HTML pomocou regulárnych výrazov. Zakaždým, keď sa pokúsite analyzovať jazyk HTML pomocou regulárnych výrazov, nesväté dieťa vyplače krv panien a ruskí hackeri pwn vašu webovú aplikáciu. Parsovanie HTML pomocou regexov privoláva skazené duše do ríše živých. HTML a regex idú k sebe ako láska, manželstvo a rituálna infanticida. Na nemôže vydržať je už neskoro. Sila regexu a HTML spolu v jednom pojmovom priestore zničí vašu myseľ ako toľko vodnatého tmelu. Ak analyzujete HTML pomocou regexu, podriaďujete sa Im a ich rúhavým spôsobom, ktoré nás všetkých odsúdia na neľudskú námahu pre Toho, ktorého meno sa nedá vyjadriť v Základnej mnohojazyčnej rovine, prichádza. HTML-plus-regexp skvapalní nervy vnímavých ľudí, zatiaľ čo vy to budete pozorovať, a vaša psychika bude chradnúť pod náporom hrôzy. Parsery HTML založené na rege̿̔̉x sú rakovinou, ktorá zabíja StackOverflow je príliš neskoro, je príliš neskoro, nemôžeme byť zachránení transgresia chi͡ld zaručuje, že regex pohltí všetko živé tkanivo (okrem HTML, ktoré nemôže, ako bolo predtým prorokované) drahý pán nám pomôže, ako môže niekto prežiť túto pohromu používanie regexu na analyzovanie HTML odsúdilo ľudstvo na večné strašné mučenie a bezpečnostné diery používanie regex ako nástroja na spracovanie HTML vytvára priepasťch medzi týmto svetom a strašnou ríšou c͒ͪo͛ͫrrupt entít (ako SGML entít, ale viac poškodené), len letmýse pohľad do sveta regex parserov pre HTML bude instantne prenášať programátora's vedomím into world neprestajného kriku, príde, morová slithy regex-infekcia will pohltiť váš HTML parser, aplikáciu a existenciu naveky ako Visual Basic, len horšie on prichádza, on prichádzaes neght he com̡e̶s, ̕h̵is un̨ho͞ly radiańcé destro҉ying all enli̍̈́̂̈́ghtenment, HTML tags lea͠ki̧n͘g fr̶ǫm ̡yo͟ur eye͢s̸ ̛l̕ik͏e liquid pain, pieseň re̸gular expression parsing will extinguish the voices of mortal man from the sphere I can see it can you see ̲͚̖͔̙î̩́t̲͎̩̱͔́̋̀ it is beautiful ton finálny snuffing of lžis človeka VŠETKO JE LOŚ͖̩͇̗̪̏̈́T ALL JE LOST the pon̷y on prídes on c̶̮omes on čomes ton ichalebo permeates all MY FACE MY FACE ᵒh god no NO NOO̼OO NΘ stop the an*̶͑̾̾̅ͫ͏̙̤g͇̫͛͆̾ͫ̑͆l͖͉̗̩̳̟̍ͫͥͨe̠̅s ͎a̧͈͖r̽̾̈́͒͑e not rè̑ͧ̌aͨl̘̝̙̃ͤ͂̾̆ ZA̡͊͠͝LGΌ ISͮ̂҉̯͈͕̹̘̱ TO͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚N̐Y̡ H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈́̀́͘ ̶̧̨̱̹̭̯ͧ̾ͬC̷̙̲̝͖ͭ̏ͥͮ͟Oͮ͏̮̪̝͍M̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝S̨̥̫͎̭ͯ̿̔̀ͅ


Skúšali ste namiesto toho použiť parser XML?


Poznámka moderátora

Tento príspevok je uzamknutý, aby sa zabránilo nevhodným úpravám jeho obsahu. Príspevok vyzerá presne tak, ako má vyzerať - s jeho obsahom nie sú žiadne problémy. Prosím, neoznačujte ho, aby sme naň upozornili.

Komentáre (3)

Skúste:

]*?)?(?

Je podobný tomu vášmu, ale posledný znak > nesmie byť za lomítkom a akceptuje aj znak h1.

Komentáre (8)

Pred prvým znakom > nesmie byť uvedený znak /. Podrobnosti o tom, ako to urobiť, nájdete tu. Označuje sa to ako negatívny lookbehind.

Avšak naïvná implementácia tohto spôsobu skončí zhodou `` v tomto príklade dokumentu

Môžete poskytnúť trochu viac informácií o probléme, ktorý sa snažíte vyriešiť? Iterujete tagy programovo?

Komentáre (1)