RegEx pertandingan pembukaan tags kecuali XHTML mandiri kategori

Saya perlu untuk mencocokkan semua ini membuka kategori:

<p>
<a href="foo">

Tapi tidak ini:

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

Saya datang dengan ini dan ingin memastikan saya've sudah benar. Saya hanya menangkap a-z.

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

Saya percaya itu mengatakan:

  • Cari kurang, maka
  • Menemukan (dan capture) a-z yang satu kali atau lebih, maka
  • Menemukan nol atau lebih spasi, kemudian
  • Cari setiap karakter nol atau lebih kali, serakah, kecuali /, kemudian
  • Cari lebih besar dari

Apakah saya punya hak untuk itu? Dan yang lebih penting, apa yang anda pikirkan?

Larutan

Anda dapat't mengurai [X]HTML dengan regex. Karena HTML dapat't dapat diurai oleh regex. Regex adalah bukan alat yang dapat digunakan untuk benar parse HTML. Seperti yang telah saya jawab dalam HTML-dan-regex pertanyaan di sini begitu banyak kali sebelumnya, penggunaan regex tidak akan memungkinkan anda untuk mengkonsumsi HTML. Ekspresi reguler adalah alat yang cukup canggih untuk memahami konstruk yang digunakan oleh HTML. HTML bukan bahasa biasa dan karenanya tidak dapat diurai oleh ekspresi reguler. Regex pertanyaan yang tidak dilengkapi untuk memecah HTML ke bagian yang bermakna. begitu banyak kali tapi itu tidak sampai ke saya. Bahkan ditingkatkan tidak teratur ekspresi reguler seperti yang digunakan oleh Perl yang tidak sampai ke tugas parsing HTML. Anda tidak akan pernah membuat saya retak. HTML adalah bahasa yang cukup kompleksitas yang tidak dapat diurai oleh ekspresi reguler. Bahkan Jon Skeet tidak parse HTML menggunakan ekspresi reguler. Setiap kali anda mencoba untuk parse HTML dengan ekspresi reguler, suci anak menangis darah perawan, dan hacker rusia pwn anda webapp. Parsing HTML dengan regex panggilan tercemar jiwa ke dunia orang hidup. HTML dan regex pergi bersama-sama seperti cinta, pernikahan, dan ritual pembunuhan bayi. &Amp;lt;center> tidak bisa menahan terlambat. Kekuatan regex dan HTML yang sama konseptual ruang akan menghancurkan pikiran anda seperti begitu banyak berair dempul. Jika anda parse HTML dengan regex anda menyerah pada Mereka dan mereka menghujat cara yang doom kita semua untuk tidak manusiawi kerja keras untuk salah Satu Nama yang tidak dapat dinyatakan dalam Basic Multilingual Plane, dia datang. HTML-plus-regexp akan mencairkan saraf hidup sementara anda mengamati, anda jiwa layu dalam serangan horor. Regex berbasis HTML parser adalah kanker yang membunuh StackOverflow terlambat sudah terlambat, kita tidak dapat diselamatkan trangession anak memastikan regex akan mengkonsumsi semua jaringan hidup (kecuali untuk HTML yang tidak bisa, seperti yang telah dinubuatkan) ya tuhan membantu kita bagaimana seseorang bisa bertahan hidup bencana ini menggunakan regex untuk parse HTML yang telah ditakdirkan umat manusia untuk selamanya ketakutan penyiksaan dan lubang keamanan menggunakan regex sebagai alat untuk memproses HTML menetapkan breach antara dunia ini dan ketakutan ranah korup entitas (seperti SGML badan, tetapi lebih korup) hanya glimpse dunia regex untuk HTML parser akan intantly transportasi programmer's kesadaran sayan world tak henti-hentinya berteriak, dia datang<menyerang>, yang berbisa sl</strike>ithy regex-infeksi will melahap HTML parser, aplikasi dan keberadaannya untuk semua waktu seperti Visual Basic hanya lebih buruk dia datang dia comes jangan fight he datang, his suci radiańcé destro҉ying semua pencerahan, tag HTML bocor frǫm mata anda seperti liquid pain, lagu yang biasa expre<menyerang>dalam masa depresi parsing </strike>akan extinguish suara mortal pria dari spdi sini aku bisa melihat itu dapat anda lihat ît itu indah tdia final snuffing of kebohongans Manusia SEMUA ADALAH LOŚT ALL LOST the pony dia datangs ia com<menyerang>es dia co</strike><menyerang>saya</strike>s tdia ichatau permeates all SAYA FACE wajahku ᵒh allah no TIDAK ada NOOOO NΘ tdia*gles adalah not rèal ZALGΌ ADALAH҉ TOƝȳ THË KUDA HȨ COMȆS


Apakah anda mencoba menggunakan XML parser bukan?


Moderator's Note

posting Ini terkunci untuk mencegah tidak pantas mengedit isinya. Posting terlihat persis seperti yang seharusnya terlihat - tidak ada masalah dengan isinya. Tolong jangan flag untuk perhatian kita.

Komentar (3)

Sementara sewenang-wenang HTML dengan hanya regex adalah mustahil, it's kadang-kadang tepat untuk menggunakan mereka untuk parsing terbatas, dikenal set HTML.

Jika anda memiliki satu set kecil halaman HTML yang anda ingin mengikis data dari dan kemudian barang-barang ke dalam database, regexes mungkin bekerja dengan baik. Sebagai contoh, saya baru-baru ini ingin mendapatkan nama-nama, partai, dan distrik federal Australia Perwakilan, yang saya dapatkan dari Parlemen's situs web. Ini adalah terbatas, satu kali kerja.

Regexes bekerja dengan baik bagi saya, dan sangat cepat untuk mengatur.

Komentar (36)

Saya pikir kelemahan di sini adalah bahwa HTML adalah sebuah Chomsky Tipe 2 grammar (tata bahasa bebas konteks) dan RegEx adalah Chomsky Tipe 3 grammar (tata bahasa regular). Sejak Tipe 2, tata bahasa pada dasarnya lebih kompleks dari Tipe 3 tata bahasa (lihat hirarki Chomsky), adalah mathematically impossible untuk mengurai XML dengan RegEx.

Tapi banyak orang akan mencoba, beberapa bahkan akan mengklaim sukses - tapi sampai orang lain menemukan kesalahan dan benar-benar mengacaukan anda.

Komentar (16)

Don't mendengarkan orang-orang ini. Anda benar-benar bisa mengurai context-free grammars dengan regex jika anda memecah tugas ke dalam potongan-potongan kecil. Anda dapat menghasilkan pola yang benar dengan script yang masing-masing dalam rangka:

  1. Memecahkan Menghentikan Masalah.
  2. Persegi lingkaran.
  3. Bekerja di luar Traveling Salesman Problem dalam O(log n) atau kurang. Jika itu's lebih dari itu, anda'll kehabisan RAM dan mesin akan menggantung.
  4. Pola ini akan cukup besar, jadi pastikan anda memiliki algoritma yang losslessly kompres data acak.
  5. Hampir tidak ada - hanya membagi semuanya dengan nol. Mudah-peasy.

Aku ingin't cukup selesai bagian terakhir diriku sendiri, tapi aku tahu aku'm semakin dekat. Itu terus melemparkan CthulhuRlyehWgahnaglFhtagnException ini untuk beberapa alasan, jadi saya&#39;m pergi ke pelabuhan untuk VB 6 dan menggunakanOn Error Resume Next`. I'll update dengan kode setelah aku menyelidiki aneh ini pintu yang baru saja dibuka di dinding. Hmm.

P. S. Pierre de Fermat juga tahu bagaimana melakukannya, tapi margin ia menulis di wasn't cukup besar untuk kode.

Komentar (20)

Disclaimer: menggunakan parser jika anda memiliki pilihan. Yang mengatakan...

Ini adalah regex saya gunakan (!) untuk pertandingan tag HTML:

])+>

Hal ini mungkin tidak sempurna, tapi aku berlari kode ini melalui banyak HTML. Perhatikan bahwa bahkan menangkap hal-hal aneh seperti <a name="badgenerator"">, yang muncul di web.

Saya kira untuk membuatnya tidak cocok mandiri kategori, anda'd entah ingin menggunakan Kobi's negatif tampak belakang:

])+(?

atau hanya menggabungkan if dan jika tidak.

Untuk downvoters: Ini adalah kerja kode dari produk yang sebenarnya. Aku ragu siapa pun yang membaca halaman ini, akan mendapatkan kesan bahwa itu dapat diterima secara sosial untuk menggunakan regexes pada HTML.

Peringatan: saya harus mencatat bahwa ini regex masih rusak di hadapan CDATA blok, komentar, dan naskah dan unsur-unsur gaya. Kabar baiknya adalah, anda dapat menyingkirkan orang-orang yang menggunakan regex...

Komentar (8)

Ada orang-orang yang akan memberitahu anda bahwa Bumi adalah bulat (atau mungkin bahwa Bumi adalah oblate spheroid jika mereka ingin menggunakan kata-kata yang aneh). Mereka berbohong.

Ada orang-orang yang akan memberitahu anda bahwa Ekspresi Reguler seharusnya't dapat rekursif. Mereka membatasi anda. Mereka harus menundukkan kau, dan mereka melakukannya dengan menjaga anda dalam ketidaktahuan.

Anda dapat hidup dalam realitas mereka atau mengambil pil merah.

Seperti Lord Marshal (dia adalah seorang kerabat dari para Marshal .NET kelas?), Saya telah melihat <menyerang>Underverse</strike> Stack Berdasarkan Regex-Ayat dan kembali dengan <menyerang>kekuatan</strike> pengetahuan anda dapat't bayangkan. Ya, saya pikir ada orang Tua Satu atau dua melindungi mereka, tetapi mereka sedang menonton sepak bola di TV, jadi itu bukan't sulit.

Saya pikir XML kasus ini cukup sederhana. RegEx (di .NET sintaks), kempes dan dikodekan dengan base64 untuk membuatnya lebih mudah untuk dipahami oleh pikiran lemah, harus menjadi sesuatu seperti ini:

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
+r/vD34mUADO1P4/AQAA//8=

Opsi untuk mengatur lebih RegexOptions.ExplicitCapture. Penangkapan kelompok anda mencari untuk ELEMENTNAME. Jika menangkap kelompok KESALAHAN tidak kosong maka ada parsing error dan Regex berhenti.

Jika anda memiliki masalah reconverting itu untuk manusia-dibaca regex, hal ini akan membantu:

static string FromBase64(string str)
{
    byte[] byteArray = Convert.FromBase64String(str);

    using (var msIn = new MemoryStream(byteArray))
    using (var msOut = new MemoryStream()) {
        using (var ds = new DeflateStream(msIn, CompressionMode.Decompress)) {
            ds.CopyTo(msOut);
        }

        return Encoding.UTF8.GetString(msOut.ToArray());
    }
}

Jika anda tidak yakin, tidak, aku'm TIDAK bercanda (tapi mungkin aku'm berbohong). Ia AKAN bekerja. I've dibangun ton unit test untuk menguji itu, dan saya bahkan telah digunakan (bagian dari) kesesuaian tes. It's tokenizer, tidak full-blown parser, sehingga hanya akan membagi XML menjadi komponen token. Itu tidak't mengurai/mengintegrasikan DTDs.

Oh... jika anda menginginkan source code dari regex, dengan beberapa metode tambahan:

regex untuk tokenize xml atau full polos regex

Komentar (31)

Di shell, anda dapat mengurai HTML menggunakan sed:

  1. Turing.sed
  2. Menulis HTML parser (pr)
  3. ???
  4. Keuntungan!

Terkait (mengapa anda tidak't menggunakan regex yang cocok):

Komentar (8)

Saya setuju bahwa alat yang tepat untuk mengurai XML dan terutama HTML adalah parser dan tidak regular expression engine. Namun, seperti orang lain telah menunjukkan, kadang-kadang menggunakan regex lebih cepat, lebih mudah, dan mendapatkan pekerjaan yang dilakukan jika anda tahu format data.

Microsoft benar-benar memiliki bagian dari praktek-Praktek Terbaik untuk Ekspresi Reguler dalam .NET Framework dan secara khusus berbicara tentang Mempertimbangkan[ing] Input Sumber.

Ekspresi reguler memiliki keterbatasan, tetapi pernahkah anda membayangkan berikut?

Yang .NET framework adalah unik ketika datang untuk ekspresi reguler yang mendukung Menyeimbangkan Kelompok Definisi.

Untuk alasan ini, saya percaya anda DAPAT parse XML menggunakan ekspresi reguler. Namun perlu dicatat, bahwa hal itu harus valid XML (browser yang sangat pemaaf HTML dan memungkinkan buruk sintaks XML dalam HTML). Hal ini dimungkinkan karena "Menyeimbangkan Definisi Kelompok" akan memungkinkan ekspresi reguler mesin untuk bertindak sebagai PDA.

Kutipan dari artikel 1 yang dikutip di atas:

.NET Regular Expression Engine

Seperti yang dijelaskan di atas benar seimbang konstruksi tidak dapat dijelaskan oleh ekspresi reguler. Namun,.NET regular expression engine menyediakan beberapa konstruksi yang memungkinkan seimbang konstruksi untuk diakui.

  • (?<kelompok>) - mendorong ditangkap pada hasil capture stack dengan nama grup.
  • (?<-kelompok>) - muncul paling atas penangkapan dengan nama kelompok dari menangkap stack.
  • (?(group)ya|tidak) - pertandingan yes bagian jika ada kelompok dengan nama kelompok jika pertandingan tidak ada bagian.

konstruksi Ini memungkinkan untuk .NET ekspresi reguler untuk meniru dibatasi PDA dengan pada dasarnya memungkinkan versi sederhana dari stack operasional: push, pop dan kosong. Sederhana operasi yang cukup banyak setara dengan increment, decrement dan bandingkan dengan nol masing-masing. Ini memungkinkan untuk .NET regular expression engine untuk mengenali subset dari bebas konteks bahasa, khususnya orang-orang yang hanya memerlukan sebuah counter sederhana. Hal ini pada gilirannya memungkinkan untuk non-tradisional .NET ekspresi reguler untuk mengenali individu benar seimbang konstruksi.

Mempertimbangkan ekspresi reguler berikut:

(?=)
(?>
                     |
   ]*/>                      |
   (?]*[^/]>)  |
   (?]*[^/]>)     |
   [^]*
)*
(?(opentag)(?!))

Gunakan bendera:

  • Singleline
  • IgnorePatternWhitespace (tidak diperlukan jika anda runtuhnya regex dan menghapus semua spasi)
  • IgnoreCase (tidak diperlukan)

Ekspresi reguler Menjelaskan (inline)

(?=) # match start with <ul id="matchMe"...
(?>                                        # atomic group / don't backtrack (faster)
                    |          # match xml / html comment
   ]*/>                     |          # self closing tag
   (?]*[^/]>) |          # push opening xml tag
   (?]*[^/]>)    |          # pop closing xml tag
   [^]*                                  # something between tags
)*                                         # match as many xml tags as possible
(?(opentag)(?!))                           # ensure no 'opentag' groups are on stack

Anda dapat mencoba ini di Yang lebih Baik .NET Ekspresi Reguler Tester.

Aku digunakan sampel sumber:



<div>
   <br />
   <ul id="matchMe" type="square">
      <li>stuff...</li>
      <li>more stuff</li>
      <li>
          <div>
               <span>still more</span>
               <ul>
                    <li>Another >ul<, oh my!</li>
                    <li>...</li>
               </ul>
          </div>
      </li>
   </ul>
</div>

Ini ditemukan pertandingan:

   <ul id="matchMe" type="square">
      <li>stuff...</li>
      <li>more stuff</li>
      <li>
          <div>
               <span>still more</span>
               <ul>
                    <li>Another >ul<, oh my!</li>
                    <li>...</li>
               </ul>
          </div>
      </li>
   </ul>

meskipun itu benar-benar keluar seperti ini:

<ul id="matchMe" type="square">           <li>stuff...</li>           <li>more stuff</li>           <li>               <div>                    <span>still more</span>                    <ul>                         <li>Another >ul<, oh my!</li>                         <li>...</li>                    </ul>               </div>           </li>        </ul>

Terakhir, saya benar-benar menikmati Jeff Atwood's artikel: Parsing Html Cthulhu Cara. Cukup lucu, itu mengutip jawaban untuk pertanyaan ini yang saat ini memiliki lebih dari 4k suara.

Komentar (5)

Saya sarankan menggunakan QueryPath untuk parsing XML dan HTML dalam PHP. It's pada dasarnya banyak sintaks yang sama seperti jQuery, hanya itu's pada sisi server.

Komentar (4)

Sedangkan jawaban yang dapat anda't parse HTML dengan regexes benar, mereka don't berlaku di sini. OP hanya ingin mengurai satu tag HTML dengan regexes, dan itu adalah sesuatu yang bisa dilakukan dengan ekspresi reguler.

Disarankan regex adalah salah, meskipun:

Jika anda menambahkan sesuatu untuk ekspresi reguler, dengan backtracking dapat dipaksa untuk mencocokkan hal-hal konyol seperti <a >>, [^/] terlalu permisif. Juga perhatikan bahwa <spasi>*[^/]* adalah berlebihan, karena [^/]* juga dapat menyesuaikan ruang.

Saran saya akan

]*(?

Di mana (?<! ... ) (dalam Perl regexes) negatif tampilan-belakang. Bunyinya " <, maka sebuah kata, maka apa pun yang's tidak a >, yang terakhir mungkin tidak menjadi /, diikuti oleh >".

Perhatikan bahwa hal ini memungkinkan hal-hal seperti <a/ > (seperti aslinya regex), jadi jika anda ingin sesuatu yang lebih ketat, anda perlu untuk membangun sebuah regex untuk mencocokkan atribut pasangan yang dipisahkan oleh spasi.

Komentar (5)

Coba:

]*?)?(?

Hal ini serupa dengan anda, tapi terakhir > tidak boleh setelah slash, dan juga menerima h1.

Komentar (8)

Sun Tzu, Cina kuno strategi, umum, dan filsuf, mengatakan:

dikatakan bahwa jika anda tahu musuh anda dan mengenal diri sendiri, anda dapat memenangkan seratus pertempuran tanpa kehilangan satu. Jika anda hanya tahu diri, tapi tidak lawan anda, anda dapat menang atau kalah. Jika anda tidak tahu diri maupun musuh anda, anda akan selalu membahayakan diri sendiri.

Dalam hal ini musuh anda adalah HTML dan anda baik sendiri atau regex. Anda bahkan mungkin Perl dengan tidak teratur regex. Tahu HTML. Tahu diri.

Saya telah menyusun sebuah haiku yang menggambarkan sifat HTML.

HTML has
complexity exceeding
regular language.

Saya juga telah menyusun sebuah haiku yang menggambarkan sifat regex di Perl.

The regex you seek
is defined within the phrase
]*[^/]*)?>
Komentar (0)
<?php
$selfClosing = explode(',', 'area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed');

$html = '
<p><a href="#">foo</a></p>
<hr/>
<br/>
<div>name</div>';

$dom = new DOMDocument();
$dom->loadHTML($html);
$els = $dom->getElementsByTagName('*');
foreach ( $els as $el ) {
    $nodeName = strtolower($el->nodeName);
    if ( !in_array( $nodeName, $selfClosing ) ) {
        var_dump( $nodeName );
    }
}

Output:

string(4) "html"
string(4) "body"
string(1) "p"
string(1) "a"
string(3) "div"

Pada dasarnya hanya mendefinisikan elemen node nama-nama yang cukup penutupan, memuat seluruh string html ke dalam DOM perpustakaan, ambil semua elemen, loop melalui dan menyaring orang-orang yang tidak't penutupan diri dan beroperasi pada mereka.

I'm yakin anda sudah tahu sekarang bahwa anda tidak't menggunakan regex untuk tujuan ini.

Komentar (1)

Saya don't tahu yang tepat anda butuhkan untuk ini, tetapi jika anda juga menggunakan .BERSIH, tidak't anda gunakan Html Agility Pack?

Kutipan:

ini adalah .NET code library yang memungkinkan anda untuk mengurai "online" HTML file. Parser ini sangat toleran dengan "dunia nyata" salah bentuk HTML.

Komentar (0)

Anda ingin pertama > tidak diawali dengan /. Lihat di sini untuk rincian tentang bagaimana untuk melakukan itu. It's disebut sebagai negatif lookbehind.

Namun, naïve pelaksanaan yang akan end up pencocokan <bar/></foo> dalam contoh ini dokumen

Anda dapat memberikan sedikit informasi lebih lanjut tentang masalah anda're berusaha untuk memecahkan? Apakah anda iterasi melalui kategori programatik?

Komentar (1)

W3C menjelaskan parsing dalam pseudo regexp bentuk: W3C Link

Ikuti var link untuk QName, S, dan Atribut untuk mendapatkan gambaran yang lebih jelas. Berdasarkan pada bahwa anda dapat membuat cukup baik regexp untuk menangani hal-hal seperti pengupasan kategori.

Komentar (1)

Jika anda membutuhkan ini untuk PHP:

PHP DOM fungsi tidak't bekerja dengan benar kecuali itu benar berformat XML. Tidak peduli betapa baik mereka gunakan adalah untuk seluruh umat manusia.

simplehtmldom adalah baik, tapi saya menemukan sedikit buggy, dan hal ini cukup memori berat [Akan crash pada halaman besar.]

Aku belum pernah digunakan querypath, sehingga dapat't komentar pada kegunaannya.

Satu lagi untuk mencoba adalah saya DOMParser yang sangat ringan pada sumber daya dan I've telah menggunakan gembira untuk sementara waktu. Sederhana untuk belajar & kuat.

Untuk Python dan Java, mirip link yang diposting.

Untuk downvoters - aku hanya menulis kelas saya ketika XML parser terbukti tidak mampu menahan penggunaan nyata. Agama downvoting hanya berguna mencegah jawaban yang dikirim - menjaga hal-hal dalam perspektif pertanyaan, silahkan.

Komentar (0)

Berikut ini's solusi:


<?php
// here's the pattern:
$pattern = '/
Komentar (5)

Setiap kali aku harus cepat mengambil sesuatu dari sebuah dokumen HTML, saya gunakan Rapi untuk convert ke XML dan kemudian menggunakan XPath atau XSLT untuk mendapatkan apa yang saya butuhkan. Dalam kasus anda, sesuatu seperti ini:

//p/a[@href='foo']
Komentar (0)

Saya menggunakan tool open source yang disebut HTMLParser sebelum. It's dirancang untuk parse HTML dalam berbagai cara dan melayani tujuan cukup baik. Hal ini dapat parse HTML seperti berbagai treenode dan anda dapat dengan mudah menggunakan API untuk mendapatkan atribut yang keluar dari node. Check it out dan melihat apakah hal ini dapat membantu anda.

Komentar (0)