Anda tidak dapat menguraikan [X] HTML dengan regex. Karena HTML tidak dapat diuraikan oleh regex. Regex bukan alat yang dapat digunakan untuk mem-parsing HTML dengan benar. Seperti yang telah saya jawab dalam pertanyaan HTML-dan-regex di sini berkali-kali sebelumnya, penggunaan regex tidak akan memungkinkan Anda untuk mengkonsumsi HTML. Ekspresi reguler adalah alat yang tidak cukup canggih untuk memahami konstruksi yang digunakan oleh HTML. HTML bukan bahasa biasa dan karenanya tidak dapat diuraikan dengan ekspresi reguler. Kueri regex tidak dilengkapi untuk memecah HTML menjadi bagian-bagian yang bermakna. berkali-kali tetapi tidak sampai ke saya. Bahkan peningkatan ekspresi reguler tidak teratur seperti yang digunakan oleh Perl tidak sesuai dengan tugas parsing HTML. Anda tidak akan pernah membuat saya retak. HTML adalah bahasa dengan kompleksitas yang cukup sehingga tidak dapat diuraikan dengan ekspresi reguler. Bahkan Jon Skeet tidak dapat mem-parsing HTML menggunakan ekspresi reguler. Setiap kali Anda mencoba mem-parsing HTML dengan ekspresi reguler, anak yang tidak suci menangis darah perawan, dan peretas Rusia membuka webapp Anda. Parsing HTML dengan regex memanggil jiwa yang tercemar ke dalam dunia yang hidup. HTML dan regex berjalan bersama seperti cinta, pernikahan, dan pembunuhan bayi ritual. <center> tidak dapat menahannya sudah terlambat. Kekuatan regex dan HTML bersama dalam ruang konseptual yang sama akan menghancurkan pikiran Anda seperti dempul yang berair. Jika Anda mem-parsing HTML dengan regex Anda menyerah pada Mereka dan cara menghujat mereka yang menghukum kita semua untuk kerja keras yang tidak manusiawi bagi Seseorang yang namanya tidak dapat dinyatakan dalam Basic Multilingual Plane, dia datang. HTML-plus-regexp akan mencairkan kebutuhan orang yang hidup sementara Anda mengamati, jiwa Anda melayang dalam serangan horor.sudah terlambat, sudah terlambat, kita tidak bisa diselamatkan . Trangession dari seorang chi ensuresld memastikan regex akan mengkonsumsi semua jaringan yang hidup (kecuali untuk HTML yang tidak bisa, seperti yang dinubuatkan sebelumnya) Tuan yang terhormat membantu kita bagaimana seseorang bisa selamat dari momok ini menggunakan regex untuk mengurai HTML telah ditakdirkan umat manusia untuk selamanya takut penyiksaan dan keamanan lubang menggunakan Rege x sebagai alat untuk proses HTML menetapkan brea ch antara dunia ini dan alam ketakutan entitas korup (seperti entitas SGML, namun lebih korup) sebuah glimp hanya se dari dunia reg mantan parser untuk HTML akan ins tantly transportasi ap kesadaran rogrammer i nto aw ORL d tak henti-hentinya berteriak, dia datang, Yang berbisa sl wil ithy regex-infeksi l melahap Anda HT ML parser, aplikasi dan eksistensi untuk semua waktu seperti Visual Basic hanya lebih buruk dia datang dia com es tidak fi GHT h e datang, HI s Unholy Radiance de stro҉ying semua pencerahan, HTML tag bocor fr̶ǫm ur yo mata seperti liq uid p ain, lagu reguler exp ulang ssion parsing akan exti nguish suara mor pria tal dari sp yang di sini saya bisa melihatnya dapat Anda lihat Hal itu t indah dia f inal snuf
fing o f kebohongan s of Man semua hilang A LL I SLOST th e Pony ia datang s ia com es ia bersama saya s t ia ich atau permeat es al l MY FAC E MY WAJAH ᵒh dewa n o NO noo O ON Θ berhenti t dia seorang * ̶͑̾̾ GL ES ͎a̧͈͖r̽̾̈́͒͑e
n ot rè̑ͧ̌aͨl̘̝̙̃ͤ͂̾̆ ZA̡͊͠͝LGΌ ISͮ̂҉̯͈͕̹̘̱ T O͇̹̺ͅƝ̴ȳ̳ TH̘ Ë͖́̉ ͠P̯͍̭O̚ N̐Y̡ H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈́̀́͘ ̶̧̨̱̹̭̯ͧ̾ͬC̷̙̲̝͖ͭ̏ͥͮ͟Oͮ͏̮̪̝͍M̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝ S̨̥̫͎̭ͯ̿̔̀ͅ
Sudahkah Anda mencoba menggunakan parser XML?
Catatan Moderator
Posting ini dikunci untuk mencegah pengeditan yang tidak pantas untuk kontennya. Posnya terlihat persis seperti yang seharusnya terlihat - tidak ada masalah dengan kontennya. Tolong jangan panji itu untuk perhatian kami.
Meskipun HTML sewenang-wenang dengan hanya sebuah regex tidak mungkin, kadang-kadang pantas digunakan untuk mem-parsing set HTML yang dikenal terbatas .
Jika Anda memiliki satu set kecil halaman HTML yang Anda inginkan untuk mengikis data dan kemudian memasukkannya ke dalam basis data, regex mungkin bekerja dengan baik. Sebagai contoh, saya baru-baru ini ingin mendapatkan nama, pesta, dan distrik dari perwakilan federal Australia, yang saya dapatkan dari situs web Parlemen. Ini adalah pekerjaan terbatas, satu kali.
Regex bekerja dengan baik untuk saya, dan sangat cepat untuk diatur.
sumber
&foo;
penyandian danCDATA
bagian? Menggunakan minifier HTML untuk menghapus semua spasi putih di dokumen Anda yang tidak dirender oleh browser? Pengurai XML tidak akan peduli, dan pernyataan XPath yang ditulis juga tidak akan. "Pengurai" berbasis regex, di sisi lain ...<font>
dll: tidak ada kelas atau ID untuk membantu menavigasi DOM. Setelah berjuang sepanjang hari dengan pendekatan "benar", saya akhirnya beralih ke solusi regex dan membuatnya bekerja dalam satu jam.Saya pikir kekurangannya di sini adalah bahwa HTML adalah tata bahasa Chomsky Type 2 (tata bahasa bebas konteks) dan RegEx adalah tata bahasa Chomsky Tipe 3 (tata bahasa biasa) . Karena tata bahasa Tipe 2 secara fundamental lebih kompleks daripada tata bahasa Tipe 3 (lihat hierarki Chomsky ), secara matematis tidak mungkin untuk mem-parsing XML dengan RegEx.
Tetapi banyak yang akan mencoba, beberapa bahkan akan mengklaim sukses - tetapi sampai yang lain menemukan kesalahan dan benar-benar mengacaukan Anda.
sumber
A -> s A e
). (X) HTML tidak memiliki properti ini dalam tag awal: tag awal tidak dapat berisi tag awal lainnya. Subset yang ingin diurai OP bukan CFG.Jangan dengarkan mereka. Anda benar - benar dapat mengurai tata bahasa bebas konteks dengan regex jika Anda memecah tugas menjadi potongan-potongan kecil. Anda dapat menghasilkan pola yang benar dengan skrip yang melakukan masing-masing secara berurutan:
Saya sendiri belum menyelesaikan bagian terakhir, tapi saya tahu saya sudah dekat. Itu terus melempar
CthulhuRlyehWgahnaglFhtagnException
karena beberapa alasan, jadi saya akan port ke VB 6 dan gunakanOn Error Resume Next
. Saya akan memperbarui dengan kode setelah saya menyelidiki pintu aneh ini yang baru saja dibuka di dinding. Hmm.PS Pierre de Fermat juga menemukan cara melakukannya, tetapi margin yang ditulisnya tidak cukup besar untuk kode.
sumber
Penafian : gunakan pengurai jika Anda memiliki pilihan. Yang mengatakan ...
Ini adalah regex yang saya gunakan (!) Untuk mencocokkan tag HTML:
Mungkin tidak sempurna, tetapi saya menjalankan kode ini melalui banyak HTML. Perhatikan bahwa ia bahkan menangkap hal-hal aneh seperti
<a name="badgenerator"">
, yang muncul di web.Saya kira untuk membuatnya tidak cocok dengan tag mandiri, Anda juga ingin menggunakan tampilan negatif Kobi :
atau hanya menggabungkan jika dan jika tidak.
Untuk downvoters: Ini adalah kode yang berfungsi dari produk yang sebenarnya. Saya ragu siapa pun yang membaca halaman ini akan mendapat kesan bahwa secara sosial dapat diterima untuk menggunakan regex pada HTML.
Peringatan : Saya harus mencatat bahwa regex ini masih rusak di hadapan blok CDATA, komentar, dan elemen skrip dan gaya. Kabar baiknya adalah, Anda dapat menyingkirkan mereka yang menggunakan ...
sumber
<!doctype html><title><</title>
. Sederhana'<!doctype html><title><</title>'.match(/<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>/g)
kembali["<!doctype html>", "<title>", "<</title>"]
sementara harus["<title>", "</title>"]
.Ada orang-orang yang akan memberi tahu Anda bahwa Bumi itu bulat (atau mungkin bahwa Bumi itu bulat bulat jika mereka ingin menggunakan kata-kata aneh). Mereka berbohong.
Ada orang yang akan memberi tahu Anda bahwa Ekspresi Reguler seharusnya tidak bersifat rekursif. Mereka membatasi Anda. Mereka perlu menaklukkan Anda, dan mereka melakukannya dengan menjaga Anda dalam ketidaktahuan.
Anda dapat hidup dalam realitas mereka atau meminum pil merah.
Seperti Lord Marshal (dia kerabat dari kelas .NET Marshal?), Saya telah melihat
Regex-VerseUnderverseStack Based dan kembali dengankekuatanpengetahuan yang tidak dapat Anda bayangkan. Ya, saya pikir ada satu atau dua Old melindungi mereka, tetapi mereka menonton sepak bola di TV, jadi itu tidak sulit.Saya pikir kasus XML cukup sederhana. RegEx (dalam sintaks .NET), dikempiskan dan dikodekan dalam base64 untuk membuatnya lebih mudah dipahami oleh pikiran lemah Anda, harus seperti ini:
Opsi untuk diatur adalah
RegexOptions.ExplicitCapture
. Grup tangkap yang Anda cari adalahELEMENTNAME
. Jika grup tangkapERROR
tidak kosong maka ada kesalahan parsing dan Regex berhenti.Jika Anda memiliki masalah dalam mengubahnya menjadi regex yang dapat dibaca manusia, ini akan membantu:
Jika Anda tidak yakin, tidak, saya TIDAK bercanda (tapi mungkin saya berbohong). Ini akan bekerja. Saya telah membangun banyak unit test untuk mengujinya, dan saya bahkan telah menggunakan (bagian dari) tes kesesuaian . Ini adalah tokenizer, bukan pengurai penuh, sehingga hanya akan membagi XML menjadi token komponennya. Itu tidak akan menguraikan / mengintegrasikan DTD.
Oh ... jika Anda ingin kode sumber regex, dengan beberapa metode tambahan:
regex untuk menandai xml atau regex polos penuh
sumber
Dalam shell, Anda dapat menguraikan HTML menggunakan sed :
Terkait (mengapa Anda tidak harus menggunakan pencocokan regex):
sumber
Saya setuju bahwa alat yang tepat untuk mem-parsing XML dan terutama HTML adalah parser dan bukan mesin ekspresi reguler. Namun, seperti yang telah ditunjukkan orang lain, terkadang menggunakan regex lebih cepat, lebih mudah, dan menyelesaikan pekerjaan jika Anda tahu format data.
Microsoft sebenarnya memiliki bagian Praktik Terbaik untuk Ekspresi Reguler di .NET Framework dan secara khusus berbicara tentang Mempertimbangkan Sumber Input .
Ekspresi Reguler memang memiliki batasan, tetapi sudahkah Anda mempertimbangkan yang berikut?
Kerangka .NET adalah unik ketika datang ke ekspresi reguler karena mendukung Balancing Group Definition .
Untuk alasan ini, saya yakin Anda BISA parsing XML menggunakan ekspresi reguler. Namun perlu dicatat, itu harus XML yang valid ( browser sangat memaafkan HTML dan memungkinkan sintaks XML yang buruk di dalam HTML ). Ini dimungkinkan karena "Balancing Group Definition" akan memungkinkan mesin ekspresi reguler untuk bertindak sebagai PDA.
Kutipan dari artikel 1 yang dikutip di atas:
Pertimbangkan ungkapan reguler berikut:
Gunakan bendera:
Dijelaskan Ekspresi Reguler (sebaris)
Anda dapat mencobanya di Penguji Ekspresi Reguler Reguler .NET yang Lebih Baik .
Saya menggunakan sumber sampel:
Ini menemukan kecocokan:
meskipun sebenarnya keluar seperti ini:
Terakhir, saya sangat menikmati artikel Jeff Atwood: Parsing Html The Cthulhu Way . Cukup lucu, mengutip jawaban atas pertanyaan ini yang saat ini memiliki lebih dari 4k suara.
sumber
System.Text
bukan bagian dari C #. Itu bagian dari .NET.(?=<ul\s*id="matchMe"\s*type="square"\s*>) # match start with <ul id="matchMe"...
), di antara "<ul" dan "id" seharusnya\s+
, tidak\s*
, kecuali jika Anda ingin cocok dengan <ulid = ...;)\s+
bukan\s*
.<img src="images/pic.jpg" />
/
dalam yang gagal untuk<img src="images/pic.jpg" />
html Anda .Saya sarankan menggunakan QueryPath untuk parsing XML dan HTML dalam PHP. Pada dasarnya ini banyak sintaks yang sama dengan jQuery, hanya saja di sisi server.
sumber
Meskipun jawaban yang Anda tidak dapat menguraikan HTML dengan regex benar, mereka tidak berlaku di sini. OP hanya ingin mengurai satu tag HTML dengan regex, dan itu adalah sesuatu yang dapat dilakukan dengan ekspresi reguler.
Regex yang disarankan salah, meskipun:
Jika Anda menambahkan sesuatu ke regex, dengan melacaknya kembali dapat dipaksa untuk mencocokkan hal-hal konyol seperti
<a >>
,[^/]
terlalu permisif. Perhatikan juga bahwa<space>*[^/]*
itu mubazir, karena[^/]*
bisa juga cocok dengan spasi.Saran saya adalah
Di mana
(?<! ... )
(dalam Perl regex) tampilan negatif di belakang. Bunyinya "a <, lalu kata, lalu apa pun yang bukan>, yang terakhir mungkin bukan /, diikuti oleh>".Perhatikan bahwa ini memungkinkan hal-hal seperti
<a/ >
(seperti halnya regex asli), jadi jika Anda menginginkan sesuatu yang lebih ketat, Anda perlu membuat regex untuk mencocokkan pasangan atribut yang dipisahkan oleh spasi.sumber
>
karakter. Saya setuju apa yang disarankan OP dapat dilakukan dengan regex, tetapi yang disajikan di sini jauh dari sederhana.Mencoba:
Ini mirip dengan milik Anda, tetapi yang terakhir
>
tidak boleh setelah tebasan, dan juga menerimah1
.sumber
>
simbol tersebut dengan benar lolos ke & gt ;.>
valid dalam nilai atribut. Memang, dalam serialisasi 'kanonik XML' Anda tidak boleh menggunakan>
. (Yang tidak sepenuhnya relevan, kecuali untuk menekankan bahwa>
dalam nilai atribut sama sekali bukan hal yang tidak biasa.)<div title="this tag is a <div></div>">hello</div>
Sun Tzu, ahli strategi, jenderal, dan filsuf Tiongkok kuno, mengatakan:
Dalam hal ini musuh Anda adalah HTML dan Anda adalah diri sendiri atau regex. Anda bahkan mungkin Perl dengan regex tidak teratur. Tahu HTML. Kenali dirimu.
Saya telah menyusun haiku yang menggambarkan sifat HTML.
Saya juga telah menyusun haiku yang menggambarkan sifat regex di Perl.
sumber
Keluaran:
Pada dasarnya hanya mendefinisikan nama-nama simpul elemen yang menutup sendiri, muat seluruh string html ke perpustakaan DOM, ambil semua elemen, lewati dan saring keluar yang tidak menutup sendiri dan beroperasi di atasnya.
Saya yakin Anda sudah tahu sekarang bahwa Anda seharusnya tidak menggunakan regex untuk tujuan ini.
sumber
NS
dan tentukan namespace.Saya tidak tahu persis kebutuhan Anda untuk ini, tetapi jika Anda juga menggunakan .NET, tidak bisakah Anda menggunakan Html Agility Pack ?
Kutipan:
sumber
Anda ingin yang pertama
>
tidak didahului oleh a/
. Lihat di sini untuk detail tentang cara melakukan itu. Ini disebut sebagai tampilan negatif di belakang.Namun, implementasi naif itu akan berakhir dengan pencocokan
<bar/></foo>
dalam dokumen contoh iniBisakah Anda memberikan sedikit informasi lebih lanjut tentang masalah yang Anda coba selesaikan? Apakah Anda melakukan iterasi melalui tag secara terprogram?
sumber
W3C menjelaskan parsing dalam bentuk regexp semu:
W3C Link
Ikuti link var untuk
QName
,S
, danAttribute
untuk mendapatkan gambaran yang lebih jelas.Berdasarkan itu Anda dapat membuat regexp yang cukup bagus untuk menangani hal-hal seperti tag pengupasan.
sumber
Jika Anda memerlukan ini untuk PHP:
The PHP DOM fungsi tidak akan berfungsi kecuali jika diformat XML. Tidak peduli seberapa baik penggunaannya bagi umat manusia.
simplehtmldom baik, tapi saya merasa agak buggy, dan itu adalah memori yang cukup berat [Akan crash pada halaman besar.]
Saya tidak pernah menggunakan querypath , jadi tidak bisa mengomentari kegunaannya.
Satu lagi untuk dicoba adalah DOMParser saya yang sangat ringan pada sumber daya dan saya telah menggunakan dengan senang hati untuk sementara waktu. Mudah dipelajari & kuat.
Untuk Python dan Java, tautan serupa diposkan.
Untuk downvoters - saya hanya menulis kelas saya ketika parser XML terbukti tidak dapat menahan penggunaan nyata. Pemunduran agama hanya mencegah agar jawaban yang bermanfaat tidak diposting - tolong simpan segala sesuatunya dalam perspektif pertanyaan.
sumber
Inilah solusinya:
Untuk mengujinya secara mendalam, saya memasukkan tag penutup otomatis string seperti:
Saya juga memasukkan tag dengan:
Jika Anda menemukan sesuatu yang tidak berfungsi dalam pembuktian konsep di atas, saya siap menganalisis kode untuk meningkatkan keterampilan saya.
<EDIT> Saya lupa bahwa pertanyaan dari pengguna adalah untuk menghindari penguraian tag penutup diri. Dalam hal ini polanya lebih sederhana, berubah menjadi ini:
Pengguna @ridgerunner memperhatikan bahwa pola tersebut tidak mengizinkan atribut yang tidak dikutip atau atribut tanpa nilai . Dalam hal ini penyetelan yang bagus membawa kita pola berikut:
</EDIT>
Memahami polanya
Jika seseorang tertarik mempelajari lebih lanjut tentang polanya, saya berikan beberapa baris:
Kiat kecil: untuk menganalisis kode ini dengan lebih baik, perlu melihat kode sumber yang dihasilkan karena saya tidak memberikan karakter khusus HTML yang lolos.
sumber
<option selected>
. Juga tidak cocok dengan tag yang valid dengan nilai atribut yang tidak dikutip, yaitu<p id=10>
.< a href="http://wtf.org" >
Saya cukup yakin itu legal, tetapi Anda tidak mencocokkannya.Setiap kali saya perlu mengekstrak sesuatu dengan cepat dari dokumen HTML, saya menggunakan Tidy untuk mengubahnya menjadi XML dan kemudian menggunakan XPath atau XSLT untuk mendapatkan yang saya butuhkan. Dalam kasus Anda, sesuatu seperti ini:
sumber
Saya menggunakan alat open source yang disebut HTMLParser sebelumnya. Ini dirancang untuk mem-parsing HTML dengan berbagai cara dan melayani tujuan dengan cukup baik. Ia dapat mem-parsing HTML sebagai treenode yang berbeda dan Anda dapat dengan mudah menggunakan API-nya untuk mendapatkan atribut dari node. Lihat dan lihat apakah ini bisa membantu Anda.
sumber
Saya suka mem-parsing HTML dengan ekspresi reguler. Saya tidak mencoba mengurai HTML idiot yang sengaja rusak. Kode ini adalah parser utama saya (edisi Perl):
Ini disebut htmlsplit, memecah HTML menjadi beberapa baris, dengan satu tag atau potongan teks pada setiap baris. Baris kemudian dapat diproses lebih lanjut dengan alat teks dan skrip lain, seperti grep , sed , Perl, dll. Aku bahkan tidak bercanda :) Selamat menikmati.
Cukup sederhana untuk mengubah script Perl saya slurp-semuanya-pertama menjadi hal streaming yang bagus, jika Anda ingin memproses halaman web yang sangat besar. Tapi itu tidak terlalu penting.
Saya yakin saya akan mendapatkan suara untuk ini.
HTML Split
Terhadap harapan saya ini mendapat beberapa upvotes, jadi saya akan menyarankan beberapa ekspresi reguler yang lebih baik:
Mereka bagus untuk XML / XHTML.
Dengan variasi kecil, ini dapat mengatasi HTML yang berantakan ... atau mengonversi HTML -> XHTML terlebih dahulu.
Cara terbaik untuk menulis ekspresi reguler adalah dalam gaya Lex / Yacc , bukan sebagai satu-baris buram atau berkomentar monstrositas multi-line. Saya belum melakukannya di sini; yang ini nyaris tidak membutuhkannya.
sumber
/(\w+)="(.*?)"/
mengasumsikan tanda kutip ganda. Ini akan kehilangan nilai dalam tanda kutip tunggal. Dalam html versi 4 dan nilai kuotasi sebelumnya diperbolehkan, jika itu kata yang sederhana./(\w+)="(.*?)"/
dapat secara keliru mencocokkan teks yang tampak seperti atribut dalam atribut, misalnya<img title="Nope down='up' for aussies" src="..." />
. Jika diterapkan secara global, itu juga akan cocok dengan hal-hal seperti itu dalam teks biasa atau dalam komentar html.Berikut adalah parser berbasis PHP yang mem-parsing HTML menggunakan beberapa regex yang tidak bertuhan. Sebagai penulis proyek ini, saya dapat memberitahu Anda mungkin untuk mem-parsing HTML dengan regex, tetapi tidak efisien. Jika Anda memerlukan solusi sisi server (seperti yang saya lakukan untuk plugin wp-Typography WordPress ), ini berfungsi.
sumber
Ada beberapa regex yang bagus untuk mengganti HTML dengan BBCode di sini . Untuk semua yang Anda sampaikan, perhatikan bahwa dia tidak mencoba mem-parsing HTML sepenuhnya, hanya untuk membersihkannya. Ia mungkin dapat membunuh tag yang tidak dapat dimengerti "parser" sederhana.
Sebagai contoh:
sumber
Tentang pertanyaan tentang metode RegExp untuk mem-parsing (x) HTML, jawaban untuk semua yang berbicara tentang beberapa batasan adalah: Anda belum cukup terlatih untuk mengatur kekuatan senjata yang kuat ini, karena NOBODY di sini berbicara tentang rekursi .
Rekan RegExp-agnostik memberi tahu saya tentang diskusi ini, yang bukan yang pertama di web tentang topik lama dan panas ini.
Setelah membaca beberapa posting, hal pertama yang saya lakukan adalah mencari string "? R" di utas ini. Yang kedua adalah mencari tentang "rekursi".
Tidak, sapi suci, tidak ada kecocokan yang ditemukan.
Karena tidak ada yang menyebutkan mekanisme utama parser dibangun, saya segera menyadari bahwa tidak ada yang mengerti.
Jika parser (x) HTML membutuhkan rekursi, parser RegExp tanpa rekursi tidak cukup untuk tujuannya. Ini adalah konstruksi sederhana.
The art hitam RegExp sulit untuk menguasai , jadi mungkin ada kemungkinan lebih lanjut kami ditinggalkan ketika mencoba dan menguji solusi pribadi kita untuk menangkap seluruh web di satu tangan ... Nah, saya yakin tentang hal itu :)
Inilah pola ajaibnya:
Cobalah.
Ini ditulis sebagai string PHP, sehingga pengubah "s" membuat kelas menyertakan baris baru.
Berikut contoh catatan pada manual PHP yang saya tulis pada Januari: Referensi
(Berhati-hatilah, dalam catatan itu saya salah menggunakan pengubah "m"; harus dihapus, meskipun dibuang oleh mesin RegExp, karena tidak ada ^ atau $ anchorage digunakan).
Sekarang, kita dapat berbicara tentang batasan metode ini dari sudut pandang yang lebih luas:
Bagaimanapun itu hanya pola RegExp, tetapi ia mengungkapkan kemungkinan untuk mengembangkan banyak implementasi yang kuat.
Saya menulis pola ini untuk menggerakkan parser keturunan rekursif dari mesin template yang saya buat dalam kerangka kerja saya, dan kinerja sangat bagus, baik dalam waktu eksekusi atau dalam penggunaan memori (tidak ada hubungannya dengan mesin template lain yang menggunakan sintaksis yang sama).
sumber
Seperti yang telah ditunjukkan oleh banyak orang, HTML bukanlah bahasa biasa yang dapat membuatnya sangat sulit untuk diuraikan. Solusi saya untuk ini adalah mengubahnya menjadi bahasa biasa menggunakan program rapi dan kemudian menggunakan parser XML untuk mengkonsumsi hasilnya. Ada banyak opsi bagus untuk ini. Program saya ditulis menggunakan Java dengan jtidy library untuk mengubah HTML menjadi XML dan kemudian Jaxen untuk xpath menjadi hasilnya.
sumber
Bagian-bagian menjelaskan:
<
: karakter awal\s*
: mungkin memiliki spasi putih sebelum nama tag (jelek tapi mungkin).(\w+)
: tag dapat berisi huruf dan angka (h1). Yah,\w
juga cocok dengan '_', tapi kurasa tidak ada salahnya. Jika ingin tahu gunakan ([a-zA-Z0-9] +) sebagai gantinya.[^/>]*
: apa pun kecuali>
dan/
sampai ditutup>
>
: penutupan>
TIDAK TERKAIT
Dan untuk orang-orang yang meremehkan ekspresi reguler mengatakan mereka hanya sekuat bahasa biasa:
a n ba n ba n yang tidak teratur dan bahkan tidak bebas konteks, dapat dicocokkan dengan
^(a+)b\1b\1$
Referensi Balik FTW !
sumber
O(MN)
(M menjadi panjang ekspresi reguler, N menjadi panjang teks). Referensi balik adalah salah satu penyebabnya. Implementasi dalam awk tidak memiliki referensi kembali dan cocok dengan semua dalamO(MN)
waktu.Jika Anda hanya berusaha menemukan tag-tag itu (tanpa ambisi untuk penguraian), cobalah ungkapan reguler ini:
Saya menulisnya dalam 30 detik, dan diuji di sini: http://gskinner.com/RegExr/
Itu cocok dengan jenis tag yang Anda sebutkan, sementara mengabaikan jenis yang Anda katakan ingin Anda abaikan.
sumber
\/>
alih-alih\\>
.\>
apa yang saya maksudkan; Saya tidak pernah bermaksud mengedit ekspresi reguler dari posting asli saya.\/
, karena itu akan melakukan kebalikan dari persyaratan. Mungkin saya pikir Anda menawarkan pola filter negatif.Menurut saya Anda mencoba mencocokkan tag tanpa tanda "/" pada akhirnya. Coba ini:
sumber
Memang benar bahwa ketika pemrograman biasanya terbaik untuk menggunakan parser dan API khusus daripada ekspresi reguler ketika berhadapan dengan HTML, terutama jika akurasi sangat penting (misalnya, jika pemrosesan Anda mungkin memiliki implikasi keamanan). Namun, saya tidak menganggap pandangan dogmatis bahwa markup gaya XML tidak boleh diproses dengan ekspresi reguler. Ada beberapa kasus ketika ekspresi reguler adalah alat yang hebat untuk pekerjaan itu, seperti ketika melakukan pengeditan satu kali dalam editor teks, memperbaiki file XML yang rusak, atau berurusan dengan format file yang terlihat seperti tetapi tidak cukup XML. Ada beberapa masalah yang harus diperhatikan, tetapi tidak dapat diatasi atau bahkan relevan.
Regex sederhana seperti
<([^>"']|"[^"]*"|'[^']*')*>
biasanya cukup baik, dalam kasus-kasus seperti yang baru saja saya sebutkan. Ini adalah solusi yang naif, semua hal dipertimbangkan, tetapi memang benar memungkinkan tanpa enkripsi>
simbol yang tidak di- dalam nilai atribut. Jika Anda mencari, misalnyatable
tag, Anda dapat menyesuaikannya sebagai</?table\b([^>"']|"[^"]*"|'[^']*')*>
.Hanya untuk memberikan gambaran seperti apa regex HTML yang lebih "canggih" akan terlihat, berikut ini melakukan pekerjaan yang cukup terhormat untuk meniru perilaku browser dunia nyata dan algoritma parsing HTML5:
Berikut ini cocok dengan definisi tag XML yang cukup ketat (meskipun tidak memperhitungkan set lengkap karakter Unicode yang diizinkan dalam nama XML):
Memang, ini tidak memperhitungkan konteks sekitar dan beberapa kasus tepi, tetapi bahkan hal-hal seperti itu dapat diatasi jika Anda benar-benar ingin (misalnya, dengan mencari di antara pertandingan dari regex lain).
Pada akhirnya, gunakan alat yang paling tepat untuk pekerjaan itu, bahkan dalam kasus ketika alat itu kebetulan merupakan regex.
sumber
Meskipun itu tidak cocok dan efektif untuk menggunakan ekspresi reguler untuk tujuan itu, kadang-kadang ekspresi reguler memberikan solusi cepat untuk masalah pencocokan sederhana dan dalam pandangan saya itu tidak terlalu mengerikan untuk menggunakan ekspresi reguler untuk pekerjaan sepele.
Ada posting blog definitif tentang pencocokan elemen HTML paling dalam yang ditulis oleh Steven Levithan.
sumber