Pertanyaan Ekspresi RegEx mencocokkan tag kecuali XHTML tag mandiri


Saya harus mencocokkan semua tag pembuka ini:

<p>
<a href="foo">

Tetapi tidak ini:

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

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

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

Saya percaya itu mengatakan:

  • Temukan yang kurang dari, lalu
  • Temukan (dan tangkap) a-z satu atau beberapa kali, lalu
  • Temukan nol atau lebih banyak ruang, lalu
  • Temukan karakter nol atau lebih kali, serakah, kecuali /, kemudian
  • Temukan yang lebih besar dari

Apakah saya memiliki hak itu? Dan yang lebih penting, bagaimana menurut Anda?


1324
2017-09-27 04:01


asal


Jawaban:


Anda tidak dapat menguraikan [X] HTML dengan regex. Karena HTML tidak dapat diuraikan oleh regex. Regex bukan alat yang dapat digunakan untuk mengurai HTML dengan benar. Seperti yang saya jawab dalam pertanyaan HTML-dan-regex di sini berkali-kali sebelumnya, penggunaan regex tidak akan memungkinkan Anda untuk mengonsumsi HTML. Ekspresi reguler adalah alat yang tidak cukup canggih untuk memahami konstruksi yang digunakan oleh HTML. HTML bukan bahasa biasa dan karenanya tidak dapat diurai oleh ekspresi reguler. Regex queries tidak diperlengkapi untuk memecah HTML menjadi bagian yang berarti. berkali-kali tetapi tidak sampai kepada saya. Bahkan ekspresi reguler tidak teratur yang ditingkatkan seperti yang digunakan oleh Perl tidak sampai pada tugas menguraikan HTML. Anda tidak akan pernah membuat saya retak. HTML adalah bahasa dengan kompleksitas yang cukup sehingga tidak dapat diurai oleh ekspresi reguler. Bahkan Jon Skeet tidak dapat menguraikan HTML menggunakan ekspresi reguler. Setiap kali Anda mencoba mengurai HTML dengan ekspresi reguler, anak yang tidak suci akan meratapi darah perawan, dan peretas Rusia membuat webapp Anda. Parsing HTML dengan regex memanggil jiwa tercemar ke dalam ranah kehidupan. HTML dan regex berjalan bersama seperti cinta, pernikahan, dan pembunuhan bayi ritual. <Center> tidak dapat menahannya sudah terlambat. Kekuatan regex dan HTML bersama-sama dalam ruang konseptual yang sama akan menghancurkan pikiran Anda seperti begitu banyak putty berair. Jika Anda mengurai HTML dengan regex Anda menyerah pada Mereka dan cara-cara mereka menghujat yang menghukum kita semua untuk bekerja tidak manusiawi untuk Satu yang namanya tidak dapat diungkapkan dalam Multilingual Plane, ia datang. HTML-plus-regexp akan mencairkan nafsu-nafsu mahluk hidup sementara Anda mengamati, jiwa Anda mengering dalam serangan horor. Parser HTML berbasis Rege adalah kanker yang membunuh StackOverflow sudah terlambat, sudah terlambat kita tidak bisa diselamatkan Trangession dari chi͡ld memastikan regex akan mengkonsumsi semua jaringan yang hidup (kecuali untuk HTML yang tidak bisa, seperti yang sebelumnya dinubuatkan) Tuan terkasih membantu kita bagaimana orang bisa bertahan dari cambukan ini menggunakan regex untuk mengurai HTML telah menabrak manusia ke dalam keabadian dari penyiksaan dan lubang keamanan yang menakutkan menggunakan regex sebagai alat untuk memproses HTML membentuk breach antara dunia ini dan ketakutan entitas c͒ͪo͛ͫrrupt (seperti entitas SGML, tapi lebih korup) hanya sekilasse dari dunia regex parser untuk HTML akan masukTantly mengangkut pkesadaran rogrammer itidak aorldan berteriak tanpa henti, dia datang, lakinfeksi rexx ithy wilAku melahap HT muML parser, aplikasi dan eksistensi untuk semua waktu seperti Visual Basic hanya lebih buruk dia datang dia comes jangan fiGht he com̡e̶s, ̕h̵iS radiańcé de un̨ho͞ly destro҉ying semua enli̍̈́̂̈́ghtenment, tag HTML lea͠ki̧n͘g fr̶ǫm ̡yo ͟ur eye͢s̸ ̛l̕ik͏e liqUid pain, lagu re expgular exp reparsing ssion akan extiNguish suara-suara mormanusia tal dari spDi sini saya bisa melihatnya dapat Anda lihat ̲͚̖͔̙î̩́t̲͎̩̱͔́̋̀ itu indah tdia final snufjari tangan okebohongans of Man ALL IS LOŚ͖̩͇̗̪̏̈́T ALL I S LOST the pon̷y dia datangs dia c̶̮omdia bersamasayas tdia ichatau permeates all FAC SAYAE WAJAH SAYA ᵒh dewa no NO NOO̼O O NΘ berhenti tdia seorang * ̶͑̾̾ ̅ͫ͏̙̤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̨̥̫͎̭ͯ̿̔̀ͅ


Sudahkah Anda mencoba menggunakan parser XML?


Catatan Moderator

Pos ini dikunci untuk mencegah pengeditan yang tidak sesuai ke kontennya. Pos terlihat persis seperti yang seharusnya terlihat - tidak ada masalah dengan isinya. Harap jangan tandai untuk perhatian kami.


4422



Meskipun benar bahwa meminta regexes untuk mengurai sewenang-wenang HTML seperti meminta pemula untuk menulis sistem operasi, kadang-kadang tepat untuk mengurai a terbatas, diketahui set HTML.

Jika Anda memiliki sekumpulan kecil halaman HTML yang ingin Anda ambil datanya dan kemudian masuk ke dalam database, regex mungkin berfungsi dengan baik. Misalnya, saya baru-baru ini ingin mendapatkan nama, pesta, dan distrik Perwakilan federal Australia, yang saya dapatkan dari situs web Parlemen. Ini adalah pekerjaan satu kali yang terbatas.

Regex bekerja dengan baik untuk saya, dan sangat cepat untuk mengaturnya.


2915



Saya pikir kekurangannya di sini adalah bahwa HTML adalah a Chomsky Type 2 grammar (context free grammar) dan RegEx adalah a Chomsky Type 3 grammar (tata bahasa reguler). Karena tata bahasa Tipe 2 pada dasarnya lebih kompleks daripada tata bahasa Tipe 3 (lihat Hierarki Chomsky), Anda tidak mungkin membuat karya ini. Tetapi banyak yang akan mencoba, beberapa akan mengklaim sukses dan yang lain akan menemukan kesalahan dan benar-benar mengacaukan Anda.


1799



Jangan dengarkan orang-orang ini. Anda sebenarnya bisa parse grammars konteks bebas dengan regex jika Anda memecah tugas menjadi bagian yang lebih kecil. Anda dapat menghasilkan pola yang benar dengan skrip yang melakukan masing-masing secara berurutan:

  1. Selesaikan Masalah Tersendat.
  2. Buat persegi lingkaran (simulasikan metode "penggaris dan kompas" untuk ini).
  3. Latih Masalah Salesman Perjalanan di O (log n). Itu harus cepat atau generator akan hang.
  4. Polanya akan sangat besar, jadi pastikan Anda memiliki algoritma yang tanpa kompres memampatkan data acak.
  5. Hampir di sana - hanya membagi semuanya dengan nol. Mudah sekali.

Saya belum menemukan bagian terakhir, tapi saya tahu saya semakin dekat. Kode saya terus melempar CthulhuRlyehWgahnaglFhtagnExceptions akhir-akhir ini, jadi saya akan port ke VB 6 dan gunakan On Error Resume Next. Saya akan memperbarui dengan kode setelah saya menyelidiki pintu aneh ini yang baru saja dibuka di dinding. Hmm

P.S. Pierre de Fermat juga tahu cara melakukannya, tetapi margin yang ditulisnya tidak cukup besar untuk kode.


1167



Penolakan: gunakan parser jika Anda memiliki opsi. Itu mengatakan ...

Ini adalah regex yang saya gunakan (!) Untuk mencocokkan tag HTML:

<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>

Mungkin tidak sempurna, tetapi saya menjalankan kode ini melalui a banyak HTML. Perhatikan bahwa itu bahkan menangkap hal-hal aneh seperti <a name="badgenerator"">, yang muncul di web.

Saya kira untuk membuatnya tidak cocok dengan tag yang ada, Anda juga ingin menggunakannya Kobinegative look-behind:

<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+(?<!/\s*)>

atau gabungkan saja jika dan jika tidak.

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

Peringatan: Saya harus mencatat bahwa regex ini masih rusak di hadapan blok CDATA, komentar, dan skrip dan elemen gaya. Kabar baiknya, Anda dapat menyingkirkan mereka yang menggunakan regex ...


1016



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

Ada orang yang akan memberi tahu Anda bahwa Ekspresi Reguler tidak boleh rekursif. Mereka membatasi Anda. Mereka perlu menundukkan Anda, dan mereka melakukannya dengan membuat Anda tidak tahu apa-apa.

Anda dapat hidup dalam realitas mereka atau mengambil pil merah.

Seperti Lord Marshal (apakah dia kerabat dari kelas Marshal. NET?), Saya telah melihat Kebalikan Stack Based Regex-Verse dan kembali dengan kekuatan pengetahuan yang tidak dapat Anda bayangkan. Ya, saya pikir ada satu atau dua Orang Tua yang melindungi mereka, tetapi mereka menonton sepakbola di TV, jadi itu tidak sulit.

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

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

Opsi untuk mengaturnya RegexOptions.ExplicitCapture. Kelompok penangkapan yang Anda cari adalah ELEMENTNAME. Jika kelompok penangkapan ERROR tidak kosong maka ada kesalahan parsing dan Regex berhenti.

Jika Anda memiliki masalah mengubahnya menjadi regex yang dapat dibaca manusia, 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, saya TIDAK bercanda (tapi mungkin saya berbohong). Ini AKAN bekerja. Saya telah membuat banyak tes unit untuk mengujinya, dan saya bahkan telah menggunakan (bagian) dari tes kesesuaian. Ini adalah tokenizer, bukan parser penuh, sehingga hanya akan memecah XML menjadi token komponennya. Ini tidak akan mem-parse / mengintegrasikan DTD.

Oh ... jika Anda ingin kode sumber regex, dengan beberapa metode tambahan:

regex tokenize sebuah xml atau regex polos penuh 


452



Di shell, Anda bisa mengurai HTML menggunakan:

  • sed meskipun:

    1. Turing
    2. Menulis parser HTML (pekerjaan rumah)
    3. ???
    4. Keuntungan!
  • hxselect dari html-xml-utils paket

  • vim/ex (yang bisa dengan mudah melompat antara tag html), sebagai contoh:

    • menghapus tag gaya dengan kode bagian dalam:

      $ curl -s http://example.com/ | ex -s +'/<style.*/norm nvatd' +%p -cq! /dev/stdin
      
  • grep, sebagai contoh:

    • mengekstrak html luar dari H1:

      $ curl -s http://example.com/ | grep -o '<h1>.*</h1>'
      <h1>Example Domain</h1>
      
    • mengekstraksi tubuh:

      $ curl -s http://example.com/ | tr '\n' ' ' | grep -o '<body>.*</body>'
      <body> <div> <h1>Example Domain</h1> ...
      
  • html2text ke parsing teks biasa:

  • menggunakan xpath (XML::XPath modul perl), lihat contoh di sini

  • perl atau Python (lihat Contoh @Gilles)

  • untuk mem-parsing banyak file sekaligus, lihat: Bagaimana mengurai ratusan file kode sumber html di shell?


Terkait (mengapa Anda tidak harus menggunakan pertandingan regex):


285



Saya setuju bahwa alat yang tepat untuk mengurai XML dan terutama HTML adalah parser dan bukan mesin ekspresi reguler. Namun, seperti yang telah ditunjukkan oleh orang lain, terkadang menggunakan regex lebih cepat, lebih mudah, dan menyelesaikan pekerjaan jika Anda tahu format datanya.

Microsoft sebenarnya memiliki bagian Praktik Terbaik untuk Ekspresi Reguler dalam .NET Framework dan secara khusus berbicara tentang Pertimbangkan [ing] Sumber Input.

Ekspresi Reguler memang memiliki batasan, tetapi apakah Anda telah mempertimbangkan hal-hal berikut?

Kerangka .NET unik ketika datang ke ekspresi reguler yang mendukung Menyeimbangkan Definisi Grup.

Untuk alasan ini, saya yakin Anda BISA mengurai XML menggunakan ekspresi reguler. Namun perlu dicatat, bahwa itu harus XML yang valid (browser sangat memaafkan HTML dan memungkinkan sintaks XML yang buruk di dalam HTML). Ini dimungkinkan karena "Penyeimbangan Kelompok Definisi" akan memungkinkan mesin ekspresi reguler bertindak sebagai PDA.

Kutipan dari artikel 1 yang dikutip di atas:

.NET Mesin Ekspresi Reguler

Sebagaimana dijelaskan di atas konstruk yang seimbang dengan baik tidak dapat dijelaskan oleh   ekspresi reguler. Namun, mesin ekspresi reguler NET   menyediakan beberapa konstruksi yang memungkinkan konstruksi seimbang   diakui.

  • (?<group>) - Mendorong hasil yang ditangkap pada capture stack dengan   grup nama.
  • (?<-group>) - Muncul bagian paling atas menangkap dengan grup nama dari   ambil tumpukan.
  • (?(group)yes|no) - cocok dengan bagian ya jika ada grup   dengan grup nama yang tidak cocok dengan bagian mana pun.

Konstruk ini memungkinkan ekspresi reguler .NET untuk meniru a   PDA dibatasi oleh dasarnya memungkinkan versi sederhana dari stack   operasi: push, pop dan kosong. Operasi sederhana cukup banyak   setara dengan kenaikan, penurunan dan bandingkan dengan nol masing-masing.   Ini memungkinkan mesin ekspresi reguler .NET mengenali suatu   bagian dari bahasa bebas konteks, khususnya yang hanya itu   membutuhkan penghitung sederhana. Ini pada gilirannya memungkinkan untuk yang non-tradisional   .NET regular expressions untuk mengenali individu dengan benar seimbang   konstruksi.

Pertimbangkan ekspresi reguler berikut:

(?=<ul\s+id="matchMe"\s+type="square"\s*>)
(?>
   <!-- .*? -->                  |
   <[^>]*/>                      |
   (?<opentag><(?!/)[^>]*[^/]>)  |
   (?<-opentag></[^>]*[^/]>)     |
   [^<>]*
)*
(?(opentag)(?!))

Gunakan bendera:

  • Garis tunggal
  • IgnorePatternWhitespace (tidak diperlukan jika Anda meruntuhkan regex dan menghapus semua spasi)
  • IgnoreCase (tidak perlu)

Ekspresi Reguler Dijelaskan (sebaris)

(?=<ul\s+id="matchMe"\s+type="square"\s*>) # match start with <ul id="matchMe"...
(?>                                        # atomic group / don't backtrack (faster)
   <!-- .*? -->                 |          # match xml / html comment
   <[^>]*/>                     |          # self closing tag
   (?<opentag><(?!/)[^>]*[^/]>) |          # push opening xml tag
   (?<-opentag></[^>]*[^/]>)    |          # 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 A Better .NET Penguji Ekspresi Reguler.

Saya menggunakan sumber sampel:

<html>
<body>
<div>
   <br />
   <ul id="matchMe" type="square">
      <li>stuff...</li>
      <li>more stuff</li>
      <li>
          <div>
               <span>still more</span>
               <ul>
                    <li>Another &gt;ul&lt;, oh my!</li>
                    <li>...</li>
               </ul>
          </div>
      </li>
   </ul>
</div>
</body>
</html>

Ini menemukan kecocokan:

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

meskipun sebenarnya keluar seperti ini:

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

Terakhir, saya sangat menikmati artikel Jeff Atwood: Mengurai Html Cara Cthulhu. Cukup lucu, itu mengutip jawaban atas pertanyaan ini yang saat ini memiliki lebih dari 4k suara.


261



Saya menyarankan untuk menggunakan QueryPath untuk mengurai XML dan HTML dalam PHP. Ini pada intinya sama sintaksnya dengan jQuery, hanya di sisi server.


255