Saya memiliki string tertentu yang ingin saya periksa apakah itu html atau bukan. Saya menggunakan regex untuk hal yang sama tetapi tidak mendapatkan hasil yang sesuai.
Saya memvalidasi regex saya dan berfungsi dengan baik di sini .
var htmlRegex = new RegExp("<([A-Za-z][A-Za-z0-9]*)\b[^>]*>(.*?)</\1>");
return htmlRegex.test(testString);
Ini biola tetapi regex tidak berjalan di sana. http://jsfiddle.net/wFWtc/
Di mesin saya, kodenya berjalan dengan baik tetapi saya mendapatkan kesalahan alih-alih benar sebagai hasilnya. Apa yang hilang di sini?
javascript
regex
pengguna1240679
sumber
sumber
<
dan setidaknya satu>
dan menyebutnya HTML, atau Anda dapat memeriksa apakah itu benar-benar valid dengan sintaks HTML yang benar, atau apa pun dari keduanya. Untuk kasus yang paling sederhana, pengurai HTML tidak diperlukan.Jawaban:
Regex yang lebih baik untuk digunakan untuk memeriksa apakah suatu string adalah HTML adalah:
Sebagai contoh:
Faktanya, ini sangat bagus, sehingga akan kembali
true
untuk setiap string yang diteruskan ke sana, karena setiap string adalah HTML . Serius, meskipun formatnya buruk atau tidak valid, itu masih HTML.Jika yang Anda cari adalah keberadaan elemen HTML, bukan hanya konten teks apa pun, Anda dapat menggunakan sesuatu di sepanjang baris:
Ini tidak akan membantu Anda mengurai HTML dengan cara apa pun, tetapi pasti akan menandai string sebagai mengandung elemen HTML.
sumber
a < b && a > c
HTML?a<b && a>c
HTML ... Saya berharap deteksi HTML dapat disederhanakan sebanyak itu. Parsing tidak pernah mudah.a < b && a > c
browser akan mengubah>
dan<
karakter ke>
dan<
entitas tepat. Jika, sebaliknya, Anda menggunakana<b && a>c
browser akan menafsirkan markupa<b && a>c</b>
karena kurangnya spasi berarti<b
membuka<b>
elemen. Berikut demo singkat tentang apa yang saya bicarakan .Metode # 1 . Berikut adalah fungsi sederhana untuk menguji apakah string berisi data HTML:
Idenya adalah mengizinkan pengurai DOM browser untuk memutuskan apakah string yang diberikan terlihat seperti HTML atau tidak. Seperti yang Anda lihat, ini hanya memeriksa
ELEMENT_NODE
(nodeType
dari 1).Saya membuat beberapa tes dan sepertinya berhasil:
Solusi ini akan mendeteksi string HTML dengan baik, namun memiliki efek samping seperti img / vide / etc. tag akan mulai mengunduh sumber daya setelah diurai dalam innerHTML.
Metode # 2 . Metode lain menggunakan DOMParser dan tidak memiliki efek samping pemuatan sumber daya:
Catatan:
1.
Array.from
adalah metode ES2015, dapat diganti dengan[].slice.call(doc.body.childNodes)
.2. Fungsi panah dalam
some
panggilan dapat diganti dengan fungsi anonim biasa.sumber
isHTML("</a>") --> false
).innerHTML
akan memaksa browser untuk mulai mengambil sumber daya tersebut. :(Sedikit validasi dengan:
Ini mencari tag kosong (beberapa sudah ditentukan sebelumnya) dan
/
menghentikan tag kosong XHTML dan memvalidasi sebagai HTML karena tag kosong ATAU akan menangkap nama tag dan mencoba menemukan tag penutupnya di suatu tempat dalam string untuk divalidasi sebagai HTML.Demo yang dijelaskan: http://regex101.com/r/cX0eP2
Memperbarui:
Lengkapi validasi dengan:
Ini melakukan validasi yang tepat karena berisi ALL tag HTML, yang kosong terlebih dahulu diikuti oleh sisanya yang memerlukan tag penutup.
Demo dijelaskan di sini: http://regex101.com/r/pE1mT5
sumber
document.querySelector('strange')
- itu akan berhasil.Jawaban zzzzBov di atas bagus, tetapi tidak memperhitungkan tag penutup yang tersesat, seperti misalnya:
Versi yang juga menangkap tag penutup bisa jadi ini:
sumber
<[a-z/][\s\S]*>
- perhatikan garis miring di kelompok pertama.Ini satu baris ceroboh yang saya gunakan dari waktu ke waktu:
Ini pada dasarnya akan mengembalikan
true
string yang berisi<
diikuti olehANYTHING
diikuti oleh>
.Oleh
ANYTHING
, maksud saya pada dasarnya apa pun kecuali string kosong.Itu tidak bagus, tapi itu satu baris.
Pemakaian
Seperti yang Anda lihat, ini jauh dari sempurna, tetapi mungkin berhasil untuk Anda dalam beberapa kasus.
sumber
Semua jawaban di sini terlalu inklusif, mereka hanya mencari
<
diikuti oleh>
. Tidak ada cara sempurna untuk mendeteksi apakah suatu string adalah HTML, tetapi Anda dapat melakukannya dengan lebih baik.Di bawah ini kami mencari tag akhir , dan akan jauh lebih ketat dan lebih akurat:
Dan ini dia aksinya:
sumber
Jika Anda membuat regex dari string literal, Anda perlu menghindari garis miring terbalik:
Ini tidak diperlukan jika Anda menggunakan literal regex, tetapi kemudian Anda perlu keluar dari garis miring:
Juga jsfiddle Anda tidak berfungsi karena Anda menetapkan
onload
penangan di dalam penangan lainonload
- default seperti yang ditetapkan di panel Kerangka & Ekstensi di sebelah kiri adalah untuk membungkus JS dalamonload
. Ubah itu menjadi opsi nowrap dan perbaiki string literal escaping dan itu "berfungsi" (dalam batasan yang ditunjukkan semua orang di komentar): http://jsfiddle.net/wFWtc/4/Sejauh yang saya tahu, ekspresi reguler JavaScript tidak memiliki referensi balik. Jadi ini bagian dari ekspresi Anda:tidak akan berfungsi di JS (tetapi akan berfungsi di beberapa bahasa lain).sumber
<br>
<hr>
<input...>
@ user1240679?/<\/?[^>]*>/.test(str)
Hanya mendeteksi apakah itu berisi tag html, mungkin xmlsumber
27 is < 42, and 96 > 42.
Ini bukan HTML.Dengan jQuery:
sumber
isHTML("<foo>");
// mengembalikan nilai benarisHTML("div");
// mengembalikan nilai benar jika adadiv
pada halaman@
bukan sintaks yang valid untuk pemilih. Jadi, ketika Anda meneruskannya ke pemilih jQuery, itu akan memunculkan pengecualian (yaitu$("[email protected]")
dari!!$(str)[0]
). Saya secara khusus mengacu pada!!$(str)[0]
porsinya. Anda baru saja mengedit jawaban Anda, tetapi sekarang Anda memeriksa HTML sebelum jQuery melakukan apa pun.Menggunakan jQuery dalam kasus ini, bentuk paling sederhana adalah:
Jika
$(testString).length = 1
, ini berarti ada satu tag HTML di dalamnyatextStging
.sumber
$()
adalah operasi pemilih CSS. Tetapi juga pabrik simpul DOM dari serialisasi HTML tekstual. Tetapi juga… sesuai jawaban lain yang menderita ketergantungan yang sama pada jQuery, "div" bukanlah HTML, tetapi itu akan kembalitrue
jika ada<div>
elemen di halaman. Ini adalah pendekatan yang sangat, sangat buruk, seperti yang saya harapkan dengan hampir semua solusi yang tidak perlu melibatkan jQuery. (Biarkan mati.)Ada solusi mewah yang melibatkan penggunaan browser itu sendiri untuk mencoba mengurai teks, mengidentifikasi jika ada node DOM yang dibuat, yang akan… lambat. Atau ekspresi reguler yang akan lebih cepat, tetapi… berpotensi tidak akurat. Ada juga dua pertanyaan yang sangat berbeda yang muncul dari masalah ini:
T1: Apakah string berisi fragmen HTML?
Apakah string bagian dari dokumen HTML, berisi markup elemen HTML atau entitas yang dikodekan? Ini dapat digunakan sebagai indikator bahwa string mungkin memerlukan pemutihan / sanitasi atau dekode entitas:
Anda dapat melihat pola ini digunakan terhadap semua contoh dari semua jawaban yang ada pada saat penulisan ini, ditambah beberapa… contoh teks yang dihasilkan WYSIWYG atau Word yang agak mengerikan dan berbagai referensi entitas karakter.
Q2: Apakah string merupakan dokumen HTML?
The spesifikasi HTML mengejutkan longgar untuk apa yang dianggap sebuah dokumen HTML . Peramban berusaha sangat keras untuk mengurai hampir semua teks sampah sebagai HTML. Dua pendekatan: pertimbangkan semua HTML (karena jika dikirimkan dengan
text/html
Jenis Konten, upaya besar akan dilakukan untuk mencoba menafsirkannya sebagai HTML oleh agen pengguna) atau mencari penanda awalan:Dalam istilah "pembentukan yang baik", itu, dan hampir tidak ada hal lain yang "diperlukan". Berikut ini adalah 100% lengkap, dokumen HTML valid penuh yang berisi setiap elemen HTML yang menurut Anda sedang dihilangkan:
Ya. Ada aturan eksplisit tentang bagaimana membentuk "hilang" unsur-unsur seperti
<html>
,<head>
, dan<body>
. Meskipun saya merasa agak lucu bahwa penyorotan sintaks SO gagal mendeteksi itu dengan benar tanpa petunjuk eksplisit.sumber
Solusi saya adalah
sumber
Ada paket NPM is-html yang dapat mencoba menyelesaikan https://github.com/sindresorhus/is-html ini
sumber
<html>
dan memberi<body>
tag, keduanya sepenuhnya opsional . Tes "tidak cocok XML" memberi tahu.