Apa cara terbaik untuk memilih semua teks antara 2 tag - mis: teks antara semua tag 'pra' pada halaman.
html
regex
html-parsing
basheps
sumber
sumber
/<div>.*?<\/div>/.exec("<div><div></div></div>")
Jawaban:
Anda dapat menggunakan
"<pre>(.*?)</pre>"
, (mengganti pra dengan teks apa pun yang Anda inginkan) dan mengekstrak grup pertama (untuk instruksi yang lebih spesifik menentukan bahasa) tetapi ini mengasumsikan gagasan sederhana bahwa Anda memiliki HTML yang sangat sederhana dan valid.Seperti yang disarankan komentator lain, jika Anda melakukan sesuatu yang kompleks, gunakan parser HTML.
sumber
<pre>
tag setelah mencoba<pre>(.*?)<\/pre>
, itu karena Anda melihat apa yang ditangkap oleh pertandingan Penuh alih-alih kelompok tangkapan (. *?). Kedengarannya murahan tapi saya selalu berpikir "kurung = sepasang pencuri" karena kecuali(
diikuti oleh?
seperti dalam(?:
atau(?>
, setiap pertandingan akan memiliki dua tangkapan: 1 untuk pertandingan penuh & 1 untuk kelompok tangkapan. Setiap set kurung tambahan menambahkan tangkapan tambahan. Anda hanya harus tahu cara mengambil kedua tangkapan dalam bahasa apa pun yang Anda gunakan.Tag dapat diselesaikan di baris lain. Inilah sebabnya mengapa
\n
perlu ditambahkan.sumber
(.|\n)*?
ketika berurusan dengan tag HTML di beberapa baris. Jawaban yang dipilih hanya berfungsi jika tag HTML berada di baris yang sama.(.|\n)*?
untuk mencocokkan arang. Selalu gunakan.
dengans
pengubah (singleline). Atau[\s\S]*?
solusinya./\*(.|\n)*?\*/
yang melakukan pekerjaan - terima kasihInilah yang akan saya gunakan.
Pada dasarnya yang dilakukannya adalah:
(?<=(<pre>))
Pilihan harus diawali dengan<pre>
tag(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|~]| )
Ini hanya ungkapan reguler yang ingin saya terapkan. Dalam hal ini, ia memilih huruf atau digit atau karakter baris baru atau beberapa karakter khusus yang tercantum dalam contoh dalam tanda kurung. Karakter pipa|
hanya berarti " ATAU ".+?
Status karakter Plus untuk memilih satu atau lebih di atas - urutan tidak masalah. Tanda tanya mengubah perilaku default dari 'serakah' menjadi 'ungreedy'.(?=(</pre>))
Seleksi harus ditambahkan oleh</pre>
tagTergantung pada kasus penggunaan Anda, Anda mungkin perlu menambahkan beberapa pengubah seperti ( i atau m )
Di sini saya melakukan pencarian ini di Sublime Text jadi saya tidak perlu menggunakan pengubah di regex saya.
Javascript tidak mendukung tampilan di belakang
Contoh di atas seharusnya bekerja dengan baik dengan bahasa seperti PHP, Perl, Java ... Javascript, bagaimanapun, tidak mendukung tampilan di belakang sehingga kita harus melupakan tentang menggunakan
(?<=(<pre>))
dan mencari beberapa jenis solusi. Mungkin lepaskan empat karakter pertama dari hasil kami untuk setiap pilihan seperti di sini Regex mencocokkan teks di antara tagLihat juga JAVASCRIPT REGEX DOCUMENTATION untuk tanda kurung yang tidak diambil
sumber
gunakan pola di bawah ini untuk mendapatkan konten di antara elemen. Ganti
[tag]
dengan elemen aktual yang ingin Anda ekstrak kontennya.Kadang tag akan memiliki atribut, seperti
anchor
tag yang dimilikihref
, lalu gunakan pola di bawah ini.sumber
<[tag]>
akan cocok<t>
,<a>
dan<g>
Replace [tag] with the actual element you wish to extract the content from
bagian itu.[]
seharusnya dihilangkan sama sekali. Itu akan lebih jelas, karena maknanya dalam RegEx dan fakta, bahwa orang memindai kode terlebih dahulu dan membaca teks setelah;)Untuk mengecualikan tag pembatas:
(?<=<pre>)
mencari teks setelahnya<pre>
(?=</pre>)
mencari teks sebelumnya</pre>
Hasil akan teks di dalam
pre
tagsumber
Anda seharusnya tidak mencoba menguraikan html dengan regex melihat pertanyaan ini dan bagaimana hasilnya.
Dalam istilah yang paling sederhana, html bukan bahasa biasa sehingga Anda tidak dapat sepenuhnya menguraikannya dengan ekspresi reguler.
Setelah mengatakan bahwa Anda dapat mengurai himpunan bagian html ketika tidak ada tag yang sama bersarang. Jadi, selama ada apa pun di antara dan bukan tag itu sendiri, ini akan berfungsi:
Ide yang lebih baik adalah menggunakan parser, seperti DOMDocument asli, untuk memuat html Anda, lalu pilih tag Anda dan dapatkan html dalam yang mungkin terlihat seperti ini:
Dan karena ini adalah parser yang tepat, ia akan dapat menangani tag bersarang dll.
sumber
php
. Tidak yakin bagaimana PHP muncul dalam gambar ...Coba ini....
sumber
Ini sepertinya ungkapan reguler paling sederhana dari semua yang saya temukan
(?:<TAG>)
dari pertandingan([\s\S]*)
dalam pertandingan(?:<\/TAG>)
dari pertandingansumber
Jawaban ini mengandaikan dukungan untuk melihat-lihat! Ini memungkinkan saya untuk mengidentifikasi semua teks antara pasang tag pembuka dan penutup. Itu semua teks antara '>' dan '<'. Ini bekerja karena melihat-lihat tidak mengkonsumsi karakter yang cocok.
(? <=>) ([\ w \ s] +) (? = </)
Saya mengujinya di https://regex101.com/ menggunakan fragmen HTML ini.
Ini adalah permainan tiga bagian: tampilan belakang, konten, dan tampilan depan.
Saya berharap itu berfungsi sebagai awal untuk 10. Keberuntungan.
sumber
Karena jawaban yang diterima tanpa kode javascript, maka tambahkan bahwa:
sumber
preg_match_all(/<pre>([^>]*?)<\/pre>/,$content,$matches)
regex ini akan memilih semua tag antara. tidak masalah apakah itu di baris baru (bekerja dengan multiline.sumber
Dalam Python, pengaturan
DOTALL
bendera akan menangkap semuanya, termasuk baris baru.python example.py
Menangkap teks antara semua tag pembuka dan penutup dalam dokumen
Untuk menangkap teks antara semua tag pembuka dan penutup dalam dokumen,
finditer
berguna. Dalam contoh di bawah ini, tiga<pre>
tag pembuka dan penutup hadir dalam string.python example2.py
sumber
Untuk beberapa baris:
sumber
Kamu bisa memakai
Pattern pattern = Pattern.compile( "[^<'tagname'/>]" );
sumber
Saya menggunakan solusi ini:
sumber
Dalam Javascript (antara lain), ini sederhana. Ini mencakup atribut dan beberapa baris:
sumber
sumber