Lebih
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?
1323
34
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 f
inal snuf
fing 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*glesadalah
not rèal ZALGΌ ADALAH҉ TOƝȳ THË KUDA HȨ COMȆSApakah anda mencoba menggunakan XML parser bukan?
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.
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.
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:
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'm pergi ke pelabuhan untuk VB 6 dan menggunakan
On 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.
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...
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:
Opsi untuk mengatur lebih
RegexOptions.ExplicitCapture
. Penangkapan kelompok anda mencari untukELEMENTNAME
. Jika menangkap kelompokKESALAHAN
tidak kosong maka ada parsing error dan Regex berhenti.Jika anda memiliki masalah reconverting itu untuk manusia-dibaca regex, hal ini akan membantu:
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
Di shell, anda dapat mengurai HTML menggunakan sed:
Terkait (mengapa anda tidak't menggunakan regex yang cocok):
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:
Mempertimbangkan ekspresi reguler berikut:
Gunakan bendera:
Ekspresi reguler Menjelaskan (inline)
Anda dapat mencoba ini di Yang lebih Baik .NET Ekspresi Reguler Tester.
Aku digunakan sampel sumber:
Ini ditemukan pertandingan:
meskipun itu benar-benar keluar seperti ini:
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.
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.
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.Coba:
Hal ini serupa dengan anda, tapi terakhir
>
tidak boleh setelah slash, dan juga menerimah1
.Sun Tzu, Cina kuno strategi, umum, dan filsuf, mengatakan:
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.
Saya juga telah menyusun sebuah haiku yang menggambarkan sifat regex di Perl.
Output:
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.
Saya don't tahu yang tepat anda butuhkan untuk ini, tetapi jika anda juga menggunakan .BERSIH, tidak't anda gunakan Html Agility Pack?
Kutipan:
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 dokumenAnda dapat memberikan sedikit informasi lebih lanjut tentang masalah anda're berusaha untuk memecahkan? Apakah anda iterasi melalui kategori programatik?
W3C menjelaskan parsing dalam pseudo regexp bentuk: W3C Link
Ikuti var link untuk
QName
,S
, danAtribut
untuk mendapatkan gambaran yang lebih jelas. Berdasarkan pada bahwa anda dapat membuat cukup baik regexp untuk menangani hal-hal seperti pengupasan kategori.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.
Berikut ini's solusi:
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:
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.