RegEx matchar öppna taggar utom XHTML-taggar som är fristående.

Jag måste matcha alla dessa öppningstaggar:

<p>
<a href="foo">

Men inte dessa:

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

Jag kom på detta och ville försäkra mig om att jag har förstått det rätt. Jag fångar bara a-z.

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

Jag tror att det står:

  • Hitta ett mindre än, sedan
  • Hitta (och fånga) a-z en eller flera gånger, sedan
  • Hitta noll eller flera mellanslag, sedan
  • Hitta alla tecken noll eller flera gånger, girigt, utom /, sedan
  • Hitta ett större än

Har jag förstått det rätt? Och ännu viktigare, vad tycker du?

Lösning

Du kan inte analysera [X]HTML med regex. Eftersom HTML inte kan analyseras med regex. Regex är inte ett verktyg som kan användas för att korrekt analysera HTML. Som jag har svarat på frågor om HTML och regex här så många gånger tidigare, kan du inte använda regex för att konsumera HTML. Reguljära uttryck är ett verktyg som inte är tillräckligt sofistikerat för att förstå de konstruktioner som används i HTML. HTML är inte ett reguljärt språk och kan därför inte analyseras av reguljära uttryck. Regex-förfrågningar är inte utrustade för att bryta ner HTML i dess meningsfulla delar. så många gånger, men det når inte fram till mig. Inte ens förbättrade oregelbundna reguljära uttryck som används i Perl klarar av att analysera HTML. Du kommer aldrig att få mig att bryta ihop. HTML är ett språk som är tillräckligt komplext för att inte kunna analyseras med hjälp av reguljära uttryck. Inte ens Jon Skeet kan analysera HTML med hjälp av reguljära uttryck. Varje gång du försöker analysera HTML med hjälp av reguljära uttryck, gråter det oheliga barnet jungfruligas blod och ryska hackare tar din webbapplikation i besittning. Att analysera HTML med reguljära uttryck kallar på smutsiga själar till de levande. HTML och regex hör ihop som kärlek, äktenskap och rituellt barnamord. Den kan inte hålla det är för sent. Kraften av regex och HTML tillsammans i samma begreppsutrymme kommer att förstöra ditt sinne som så mycket vattnigt kitt. Om du analyserar HTML med regex ger du efter för dem och deras hädiska sätt som dömer oss alla till omänskligt slit för den vars namn inte kan uttryckas i det grundläggande flerspråkiga planet, han kommer. HTML-plus-regexp kommer att göra de kännande människornas nerver flytande medan du observerar, och ditt psyke kommer att förtvina i skräckens anstormning. Rege̿̔̉x-baserade HTML-parsers är cancern som dödar StackOverflow det är för sent det är för sent vi kan inte räddas transgressionen av en chi͡ld säkerställer att regex kommer att konsumera all levande vävnad (utom HTML som den inte kan, som tidigare profeterats) kära herre hjälp oss hur kan någon överleva detta gissel att använda regex för att analysera HTML har dömt mänskligheten till en evighet av fruktansvärd tortyr och säkerhetshål att använda regex som ett verktyg för att bearbeta HTML etablerar en brytning mellan denna värld och det fruktansvärda riket av c͒ͪo͛ͫrrupt entiteter (som SGML entiteter, men mer korrupta) kommer en enkel glimt av världen av regex parsers för HTML att på ett instantly transport a programmer's medvetande into a world av oupphörligt skrikande, han kommer, den pestlika slithy regex-infektionen kommerl sluka din HTML parser, applikation och existens för all framtid som Visual Basic fast värre he comes he comes inte fight 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, the song of 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 the final snuffing of the lies of Man ALL IS LOŚ͖̩͇̗̪̏̈́T ALL IS LOST the pon̷y he comes he c̶̮omes he comes the ichor permeates all MY FACE MY FACE ᵒh god no NO NOO 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̨̥̫͎̭ͯ̿̔̀ͅ


Har du försökt använda en XML-parser i stället?


Moderator's Note

Det här inlägget är låst för att förhindra olämpliga ändringar av innehållet. Inlägget ser ut precis som det ska se ut - det finns inga problem med innehållet. Var vänlig och flagga inte för att uppmärksamma oss på det.

Kommentarer (3)

Försök:

]*?)?(?

Den liknar din, men det sista > får inte vara efter ett snedstreck, och accepterar även h1.

Kommentarer (8)

Du vill att den första > inte ska föregås av ett /. Se här för detaljer om hur du gör det. Det kallas negativ lookbehind.

En naïve implementering av detta kommer dock att sluta med att matcha `` i det här exempeldokumentet.

Kan du ge lite mer information om det problem du försöker lösa? Iterar du genom taggar programatiskt?

Kommentarer (1)