Saya mencoba untuk mencocokkan <input>
jenis "tersembunyi" menggunakan pola ini:
/<input type="hidden" name="([^"]*?)" value="([^"]*?)" />/
Ini adalah contoh formulir data:
<input type="hidden" name="SaveRequired" value="False" /><input type="hidden" name="__VIEWSTATE1" value="1H4sIAAtzrkX7QfL5VEGj6nGi+nP" /><input type="hidden" name="__VIEWSTATE2" value="0351118MK" /><input type="hidden" name="__VIEWSTATE3" value="ZVVV91yjY" /><input type="hidden" name="__VIEWSTATE0" value="3" /><input type="hidden" name="__VIEWSTATE" value="" /><input type="hidden" name="__VIEWSTATE" value="" />
Tapi saya tidak yakin bahwa type
, name
, dan value
atribut akan selalu muncul dalam urutan yang sama. Jika type
atribut datang terakhir, kecocokan akan gagal karena dalam pola saya itu di awal.
Pertanyaan:
Bagaimana saya bisa mengubah pola saya sehingga akan cocok terlepas dari posisi atribut pada <input>
tag?
PS: Ngomong-ngomong saya menggunakan RegEx Desktop Tool berbasis Adobe Air untuk menguji ekspresi reguler.
Jawaban:
Bertentangan dengan semua jawaban di sini, untuk apa yang Anda coba lakukan regex adalah solusi yang sangat valid. Ini karena Anda TIDAK mencoba mencocokkan tag seimbang - ITU tidak mungkin dengan regex! Tetapi Anda hanya mencocokkan apa yang ada dalam satu tag, dan itu biasa saja.
Inilah masalahnya. Anda tidak dapat melakukannya hanya dengan satu regex ... Anda perlu melakukan satu kecocokan untuk mendapatkan
<input>
tag, kemudian melakukan pemrosesan lebih lanjut. Perhatikan bahwa ini hanya akan berfungsi jika tidak ada nilai atribut yang memiliki>
karakter di dalamnya, jadi itu tidak sempurna, tetapi itu sudah cukup untuk input yang masuk akal.Berikut ini beberapa kode Perl (pseudo) untuk menunjukkan kepada Anda apa yang saya maksud:
Prinsip dasar di sini adalah, jangan mencoba melakukan terlalu banyak dengan satu ekspresi reguler. Seperti yang Anda perhatikan, ekspresi reguler memberlakukan sejumlah pesanan. Jadi yang perlu Anda lakukan adalah mencocokkan dulu KONTEKS dari apa yang Anda coba ekstrak, kemudian lakukan pengiriman data yang Anda inginkan.
EDIT: Namun, saya akan setuju bahwa secara umum, menggunakan parser HTML mungkin lebih mudah dan lebih baik dan Anda benar-benar harus mempertimbangkan mendesain ulang kode Anda atau memeriksa ulang tujuan Anda. :-) Tapi saya harus memposting jawaban ini sebagai lawan dari reaksi spontan yang menguraikan subset HTML apa pun adalah tidak mungkin: HTML dan XML sama-sama tidak beraturan ketika Anda mempertimbangkan keseluruhan spesifikasi, tetapi spesifikasi tag cukup teratur , tentu saja dalam kekuatan PCRE.
sumber
Oh Ya, Anda Dapat Menggunakan Regex untuk Mengurai HTML!
Untuk tugas yang Anda coba, regex benar - benar baik-baik saja!
Ini adalah benar bahwa kebanyakan orang meremehkan kesulitan parsing HTML dengan ekspresi reguler dan karena itu melakukannya buruk.
Tetapi ini bukan kelemahan mendasar yang terkait dengan teori komputasi. Konyol itu banyak dibiakkan di sekitar sini , tetapi jangan Anda percayai mereka.
Jadi sementara itu pasti bisa dilakukan (postingan ini berfungsi sebagai bukti keberadaan fakta yang tidak bisa dibantah ini), itu tidak berarti harus begitu .
Anda harus memutuskan sendiri apakah Anda siap untuk menulis apa yang dianggap sebagai pengurai HTML khusus dan khusus dari regex. Kebanyakan orang tidak.
Tapi saya . ☻
Solusi Parsing HTML Berbasis Regex Umum
Pertama saya akan menunjukkan betapa mudahnya untuk mem - parsing HTML sewenang-wenang dengan regex. Program lengkap ada di akhir postingan ini, tetapi inti dari pengurai adalah:
Lihat betapa mudahnya membaca?
Seperti yang tertulis, ini mengidentifikasi setiap bagian dari HTML dan memberitahu di mana ia menemukan bagian itu. Anda dapat dengan mudah memodifikasinya untuk melakukan apa pun yang Anda inginkan dengan jenis karya yang diberikan, atau untuk jenis yang lebih khusus dari ini.
Saya tidak memiliki test case yang gagal (kiri :): Saya telah berhasil menjalankan kode ini pada lebih dari 100.000 file HTML - setiap yang saya dapat dengan cepat dan mudah saya dapatkan. Selain itu, saya juga menjalankannya pada file yang khusus dibuat untuk memecah parser yang naif.
Ini bukan parser yang naif.
Oh, aku yakin itu tidak sempurna, tapi aku belum berhasil memecahkannya. Saya pikir meskipun ada sesuatu, perbaikannya akan mudah dilakukan karena struktur program yang jelas. Bahkan program regex-berat harus memiliki struktur.
Nah, itu tidak mungkin, izinkan saya menjawab pertanyaan OP.
Demo Memecahkan Tugas OP Menggunakan Regex
Program kecil
html_input_rx
yang saya sertakan di bawah ini menghasilkan output berikut, sehingga Anda dapat melihat bahwa parsing HTML dengan regex berfungsi dengan baik untuk apa yang ingin Anda lakukan:Masukkan Tag Input Input, See No Evil Input
Inilah sumber untuk program yang menghasilkan output di atas.
Ini dia! Tidak ada apa-apa! :)
Hanya Anda yang bisa menilai apakah keahlian Anda dengan regex sesuai dengan tugas parsing tertentu. Tingkat keahlian setiap orang berbeda, dan setiap tugas baru berbeda. Untuk pekerjaan di mana Anda memiliki set input yang terdefinisi dengan baik, regex jelas merupakan pilihan yang tepat, karena itu sepele untuk menyatukan beberapa ketika Anda memiliki subset HTML yang terbatas untuk ditangani. Bahkan pemula regex harus menangani pekerjaan itu dengan regex. Ada lagi yang berlebihan.
Namun , begitu HTML mulai berkurang, setelah mulai bercampur dengan cara-cara yang tidak dapat Anda prediksi tetapi yang legal, setelah Anda harus mencocokkan lebih banyak hal yang berbeda atau dengan dependensi yang lebih kompleks, Anda akhirnya akan mencapai titik di mana Anda harus bekerja lebih keras untuk menghasilkan solusi yang menggunakan regex daripada menggunakan kelas parsing. Di mana titik impas jatuh tergantung lagi pada tingkat kenyamanan Anda sendiri dengan regex.
Jadi apa yang harus aku lakukan?
Saya tidak akan memberi tahu Anda apa yang harus Anda lakukan atau apa yang tidak dapat Anda lakukan. Saya pikir itu salah. Saya hanya ingin memberi Anda kemungkinan, buka sedikit mata Anda. Anda bisa memilih apa yang ingin Anda lakukan dan bagaimana Anda ingin melakukannya. Tidak ada yang absolut - dan tidak ada orang lain yang tahu situasi Anda sendiri sebaik Anda sendiri. Jika sesuatu sepertinya terlalu banyak bekerja, yah, mungkin memang begitu. Pemrograman harus menyenangkan , Anda tahu. Jika tidak, Anda mungkin salah melakukannya.
Orang dapat melihat
html_input_rx
program saya dengan sejumlah cara yang valid. Salah satunya adalah Anda memang dapat mem - parsing HTML dengan ekspresi reguler. Tetapi yang lain adalah bahwa itu jauh, jauh, jauh lebih sulit daripada yang pernah dipikirkan oleh siapa pun. Ini dapat dengan mudah mengarah pada kesimpulan bahwa program saya adalah bukti dari apa yang tidak boleh Anda lakukan, karena itu terlalu sulit.Saya tidak akan tidak setuju dengan itu. Tentu saja jika semua yang saya lakukan dalam program saya tidak masuk akal bagi Anda setelah beberapa penelitian, maka Anda seharusnya tidak mencoba menggunakan regex untuk tugas semacam ini. Untuk HTML spesifik, regex itu bagus, tetapi untuk HTML umum, itu sama saja dengan kegilaan. Saya menggunakan kelas parsing sepanjang waktu, terutama jika itu HTML saya belum membuat sendiri.
Regex optimal untuk masalah parsing HTML kecil , pessimal untuk yang besar
Sekalipun program saya dianggap sebagai ilustrasi mengapa Anda tidak boleh menggunakan regex untuk mem-parsing HTML umum - yang tidak apa-apa, karena saya agak bermaksud demikian - ☺ - masih harus menjadi pembuka mata sehingga lebih banyak orang mematahkan hal yang sangat umum dan kebiasaan menulis yang tidak menyenangkan, tidak terstruktur, dan tidak terpelihara.
Pola tidak harus jelek, dan tidak harus sulit. Jika Anda membuat pola jelek, itu adalah refleksi Anda, bukan mereka.
Bahasa Regex Fenomenal Indah
Saya telah diminta untuk menunjukkan bahwa solusi profesional saya untuk masalah Anda telah ditulis dalam Perl. Apakah kamu terkejut? Apakah kamu tidak memperhatikan? Apakah wahyu ini mengejutkan?
Memang benar bahwa tidak semua alat dan bahasa pemrograman lainnya cukup nyaman, ekspresif, dan kuat ketika datang ke regex seperti Perl. Ada spektrum besar di luar sana, dengan beberapa lebih cocok daripada yang lain. Secara umum, bahasa yang telah menyatakan regex sebagai bagian dari bahasa inti alih-alih sebagai perpustakaan lebih mudah digunakan. Saya tidak melakukan apa pun dengan regex yang tidak dapat Anda lakukan, katakanlah, PCRE, meskipun Anda akan menyusun program secara berbeda jika Anda menggunakan C.
Akhirnya bahasa-bahasa lain akan menyusul di mana Perl sekarang dalam hal regex. Saya mengatakan ini karena ketika Perl dimulai, tidak ada orang lain yang memiliki regex Perl. Katakan apa pun yang Anda suka, tetapi di sinilah Perl jelas menang: semua orang menyalin regex Perl meskipun pada berbagai tahap perkembangan mereka. Perl memelopori hampir (tidak semua, tetapi hampir) segala sesuatu yang Anda andalkan dalam pola modern saat ini, tidak peduli alat atau bahasa apa yang Anda gunakan. Jadi akhirnya yang lain akan menyusul.
Tapi mereka hanya akan mengejar dimana Perl di masa lalu, sama seperti sekarang. Semuanya maju. Dalam regex jika tidak ada yang lain, di mana Perl memimpin, yang lain mengikuti. Di mana Perl akan setelah semua orang akhirnya mengejar ke tempat Perl sekarang? Saya tidak tahu, tapi saya tahu kita juga akan pindah. Mungkin kita akan lebih dekat dengan gaya pola kerajinan Perl₆ .
Jika Anda menyukai hal semacam itu tetapi ingin menggunakannya dalam Perl₅, Anda mungkin tertarik pada modul Regexp :: Grammars yang luar biasa dari Damian Conway . Ini benar-benar luar biasa, dan membuat apa yang saya lakukan di sini dalam program saya tampak sama primitifnya dengan saya membuat pola-pola yang dijejali orang tanpa spasi putih atau pengidentifikasi alfabet. Saksikan berikut ini!
Chunker HTML sederhana
Berikut adalah sumber lengkap untuk parser yang saya perlihatkan bagian tengahnya dari pada awal posting ini.
Saya tidak menyarankan Anda harus menggunakan ini di atas kelas parsing yang teruji. Tapi saya bosan dengan orang-orang yang berpura-pura tidak ada yang bisa menguraikan HTML dengan regex hanya karena mereka tidak bisa. Anda jelas bisa, dan program ini adalah bukti dari pernyataan itu.
Tentu, itu tidak mudah, tapi itu adalah mungkin!
Dan mencoba melakukannya adalah pemborosan waktu, karena ada kelas parsing yang baik yang harus Anda gunakan untuk tugas ini. Jawaban yang tepat untuk orang yang mencoba menguraikan HTML sewenang-wenang bukanlah bahwa itu tidak mungkin. Itu adalah jawaban yang lancar dan tidak jujur. Jawaban yang benar dan jujur adalah bahwa mereka tidak boleh mencobanya karena terlalu merepotkan untuk mencari tahu dari awal; mereka tidak harus mematahkan punggungnya untuk berusaha menemukan roda yang berfungsi dengan baik.
Di sisi lain, HTML yang termasuk dalam subset yang dapat diprediksi sangat mudah diurai dengan regex. Tidak heran orang mencoba menggunakannya, karena untuk masalah kecil, masalah mainan mungkin, tidak ada yang lebih mudah. Itu sebabnya sangat penting untuk membedakan dua tugas - spesifik vs generik - karena ini tidak selalu menuntut pendekatan yang sama.
Saya berharap di masa depan di sini untuk melihat perlakuan yang lebih adil dan jujur atas pertanyaan tentang HTML dan regex.
Inilah lexer HTML saya. Itu tidak mencoba melakukan pengesahan parse; itu hanya mengidentifikasi unsur-unsur leksikal. Anda mungkin menganggapnya lebih sebagai chunker HTML daripada parser HTML. Ini tidak terlalu memaafkan HTML yang rusak, meskipun membuat beberapa kelonggaran sangat kecil ke arah itu.
Bahkan jika Anda tidak pernah menguraikan HTML lengkap sendiri (dan mengapa Anda harus melakukannya? Ini adalah masalah yang dipecahkan!), Program ini memiliki banyak bit regex keren yang saya percaya banyak orang dapat belajar banyak dari. Nikmati!
sumber
//input[@type="hidden"]
. Atau jika Anda tidak ingin menggunakan xpath, dapatkan semua input dan filter yang tersembunyigetAttribute
.Saya lebih suka # 2.
Hasil:
sumber
Dalam semangat solusi lexer Tom Christiansen, inilah tautan ke artikel 1998 yang tampaknya terlupakan oleh Robert Cameron, REX: XML Parsing Dangkal dengan Ekspresi Reguler.
http://www.cs.sfu.ca/~cameron/REX.html
Jika Anda senang membaca tentang ekspresi reguler, makalah Cameron sangat menarik. Tulisannya ringkas, menyeluruh, dan sangat rinci. Dia tidak hanya menunjukkan kepada Anda bagaimana membangun ekspresi reguler REX tetapi juga pendekatan untuk membangun regex kompleks dari bagian yang lebih kecil.
Saya telah menggunakan ekspresi reguler REX hidup dan mati selama 10 tahun untuk memecahkan masalah yang ditanyakan oleh poster awal (bagaimana cara mencocokkan tag khusus ini tetapi tidak dengan tag yang sangat mirip lainnya?). Saya telah menemukan regex yang dikembangkannya untuk sepenuhnya dapat diandalkan.
REX sangat berguna ketika Anda berfokus pada detail leksikal dokumen - misalnya, ketika mengubah satu jenis dokumen teks (misalnya, teks biasa, XML, SGML, HTML) menjadi yang lain, di mana dokumen tersebut mungkin tidak valid, terbentuk dengan baik, atau bahkan dapat diuraikan untuk sebagian besar transformasi. Ini memungkinkan Anda menargetkan pulau markup di mana saja di dalam dokumen tanpa mengganggu sisa dokumen.
sumber
Sementara saya suka isi dari sisa jawaban ini, mereka tidak benar-benar menjawab pertanyaan secara langsung atau dengan benar. Bahkan jawaban Platinum terlalu rumit, dan juga kurang efisien. Jadi saya terpaksa mengatakan ini.
Saya pendukung besar Regex, bila digunakan dengan benar. Tetapi karena stigma (dan kinerja), saya selalu menyatakan bahwa XML atau HTML yang terbentuk dengan baik harus menggunakan XML Parser. Dan bahkan kinerja yang lebih baik adalah penguraian string, meskipun ada garis antara keterbacaan jika itu terlalu di luar kendali. Namun, itu bukan pertanyaannya. Pertanyaannya adalah bagaimana cara mencocokkan tag input tipe tersembunyi. Jawabannya adalah:
Tergantung pada rasa Anda, satu-satunya opsi regex yang perlu Anda sertakan adalah opsi ignorecase.
sumber
<input type='hidden' name='Oh, <really>?' value='Try a real HTML parser instead.'>
>
di bidang nama hampir tidak ada, memang mungkin untuk ada>
dalam menangani tindakan. EG: Panggilan javascript inline di properti OnClick. Yang sedang berkata, saya memiliki parser XML untuk mereka, tetapi juga memiliki Regex untuk mereka di mana dokumen yang saya berikan terlalu kacau untuk parser XML untuk menangani, tetapi Regex bisa. Selain itu, ini bukan pertanyaannya. Anda tidak akan pernah mengalami situasi ini dengan input tersembunyi, dan jawaban saya adalah yang terbaik.Ya, <really>!
./>
adalah XML-isme; itu tidak diperlukan dalam versi HTML apa pun, kecuali XHTML (yang tidak pernah benar-benar mendapatkan banyak daya tarik, dan telah semuanya digantikan oleh HTML5). Dan Anda benar bahwa ada banyak HTML berantakan yang tidak benar-benar valid, tetapi parser HTML ( bukan XML) yang bagus harus bisa mengatasi sebagian besar; jika tidak, kemungkinan besar tidak akan ada peramban.Anda dapat mencoba ini:
dan untuk hasil yang lebih dekat Anda dapat mencoba ini:
Anda dapat menguji pola regex Anda di sini http://regexpal.com/
pattens ini baik untuk ini:
dan untuk urutan acak
type
,name
danvalue
Anda dapat menggunakan ini:atau
hal ini :
`
omong-omong saya pikir Anda menginginkan sesuatu seperti ini:
itu tidak baik tetapi bekerja dengan cara apa pun.
mengujinya di: http://regexpal.com/
sumber
Saya ingin menggunakan
**DOMDocument**
untuk mengekstrak kode html.BTW, Anda bisa mengujinya di sini - regex101.com. Ini menunjukkan hasilnya secara real time. Beberapa aturan tentang Regexp: http://www.eclipse.org/tptp/home/downloads/installguide/gla_42/ref/rregexp.html Reader .
sumber
misalkan konten html Anda disimpan dalam string html maka untuk mendapatkan setiap input yang mengandung tipe tersembunyi Anda dapat menggunakan ekspresi reguler
pencarian regex di atas
<input
diikuti oleh sejumlah karakter sampai mendapattype="hidden"
atau ketik = 'disembunyikan' diikuti oleh sejumlah karakter hingga>
/ g beri tahu ekspresi reguler untuk menemukan setiap substring yang cocok dengan pola yang diberikan.
sumber