Tengo una determinada cadena para la que quiero comprobar si es un html o no. Estoy usando expresiones regulares para lo mismo pero no obtengo el resultado adecuado.
Validé mi expresión regular y funciona bien aquí .
var htmlRegex = new RegExp("<([A-Za-z][A-Za-z0-9]*)\b[^>]*>(.*?)</\1>");
return htmlRegex.test(testString);
Aquí está el violín, pero la expresión regular no se está ejecutando allí. http://jsfiddle.net/wFWtc/
En mi máquina, el código funciona bien pero obtengo un falso en lugar de verdadero como resultado. ¿Qué me falta aquí?
javascript
regex
usuario1240679
fuente
fuente
<
y al menos uno>
y llamarlo HTML, o puede verificar que sea estrictamente válido con la sintaxis HTML correcta, o cualquier cosa intermedia. Para los casos más simples, no es necesario un analizador HTML.Respuestas:
Una expresión regular mejor para usar para verificar si una cadena es HTML es:
Por ejemplo:
De hecho, es tan bueno que regresará
true
por cada cadena que se le pase, lo cual se debe a que cada cadena es HTML . En serio, incluso si tiene un formato deficiente o no es válido, sigue siendo HTML.Si lo que está buscando es la presencia de elementos HTML, en lugar de simplemente cualquier contenido de texto, puede usar algo como:
No lo ayudará a analizar el HTML de ninguna manera, pero ciertamente marcará la cadena como que contiene elementos HTML.
fuente
a < b && a > c
HTML?a<b && a>c
HTML ... Desearía que la detección de HTML se simplificara tanto. Analizar nunca es fácil.a < b && a > c
el navegador a su vez, el>
y<
caracteres en>
y<
entidades apropiadamente. Si, en cambio, utilizaa<b && a>c
el navegador interpretará el marcado comoa<b && a>c</b>
porque la falta de un espacio significa que<b
abre un<b>
elemento. Aquí hay una demostración rápida de lo que estoy hablando .Método # 1 . Aquí está la función simple para probar si la cadena contiene datos HTML:
La idea es permitir que el analizador DOM del navegador decida si la cadena proporcionada se parece a un HTML o no. Como puede ver, simplemente busca
ELEMENT_NODE
(nodeType
de 1).Hice un par de pruebas y parece que funciona:
Esta solución detectará correctamente la cadena HTML, sin embargo, tiene un efecto secundario que img / vide / etc. Las etiquetas comenzarán a descargar el recurso una vez analizadas en innerHTML.
Método # 2 . Otro método usa DOMParser y no tiene efectos secundarios de recursos de carga:
Notas:
1.
Array.from
es el método ES2015, se puede reemplazar por[].slice.call(doc.body.childNodes)
.2. La función de flecha en la
some
llamada se puede reemplazar con la función anónima habitual.fuente
isHTML("</a>") --> false
).innerHTML
forzará al navegador a comenzar a buscar esos recursos. :(Un poco de validación con:
Esto busca etiquetas vacías (algunas predefinidas) y
/
etiquetas vacías XHTML terminadas y valida como HTML debido a la etiqueta vacía O capturará el nombre de la etiqueta e intentará encontrar su etiqueta de cierre en algún lugar de la cadena para validarla como HTML.Demostración explicada: http://regex101.com/r/cX0eP2
Actualizar:
Validación completa con:
Esto hace una validación adecuada ya que contiene TODAS las etiquetas HTML, primero las vacías y luego las demás que necesitan una etiqueta de cierre.
Demostración explicada aquí: http://regex101.com/r/pE1mT5
fuente
document.querySelector('strange')
: funcionará.La respuesta de zzzzBov anterior es buena, pero no tiene en cuenta las etiquetas de cierre perdidas, como por ejemplo:
Una versión que también captura etiquetas de cierre podría ser esta:
fuente
<[a-z/][\s\S]*>
... nota la barra en el primer grupo.Aquí hay una frase descuidada que uso de vez en cuando:
Básicamente, regresará
true
para cadenas que contengan un<
seguido deANYTHING
seguido de>
.Con
ANYTHING
, me refiero básicamente a cualquier cosa excepto a una cadena vacía.No es genial, pero es una frase.
Uso
Como puede ver, está lejos de ser perfecto, pero podría hacer el trabajo por usted en algunos casos.
fuente
Todas las respuestas aquí son demasiado inclusivas, solo buscan
<
seguido de>
. No existe una forma perfecta de detectar si una cadena es HTML, pero puede hacerlo mejor.A continuación, buscamos etiquetas finales y serán mucho más ajustadas y precisas:
Y aquí está en acción:
fuente
Si está creando una expresión regular a partir de un literal de cadena, debe escapar de las barras invertidas:
Esto no es necesario si usa un literal de expresión regular, pero luego debe escapar de las barras diagonales:
Además, su jsfiddle no funcionó porque asignó un
onload
controlador dentro de otroonload
controlador; el valor predeterminado establecido en el panel Frameworks & Extensions a la izquierda es envolver el JS en un archivoonload
. Cambie eso a una opción nowrap y corrija el escape literal de la cadena y "funciona" (dentro de las restricciones que todos han señalado en los comentarios): http://jsfiddle.net/wFWtc/4/Hasta donde yo sé, las expresiones regulares de JavaScript no tienen referencias inversas. Entonces esta parte de tu expresión:no funcionará en JS (pero funcionaría en algunos otros idiomas).fuente
<br>
<hr>
<input...>
@ user1240679?/<\/?[^>]*>/.test(str)
Solo detecta si contiene etiquetas html, puede ser un xmlfuente
27 is < 42, and 96 > 42.
Esto no es HTML.Con jQuery:
fuente
isHTML("<foo>");
// devuelve verdaderoisHTML("div");
// devuelve verdadero si haydiv
s en la página@
es una sintaxis válida para un selector. Por lo tanto, cuando lo pasa a un selector de jQuery, lanzará una excepción (es decir,$("[email protected]")
desde!!$(str)[0]
). Me refiero específicamente a la!!$(str)[0]
porción. Acaba de editar su respuesta, pero ahora está comprobando HTML antes de que jQuery haga algo.Usando jQuery en este caso, la forma más simple sería:
Si
$(testString).length = 1
, esto significa que hay una etiqueta HTML dentrotextStging
.fuente
$()
es una operación de selector de CSS. Pero también una fábrica de nodos DOM a partir de la serialización HTML textual. Pero también ... según la otra respuesta que sufre la misma dependencia de jQuery, "div" no es HTML, pero eso devolveríatrue
si<div>
existe algún elemento en la página. Este es un enfoque muy, muy malo, como he llegado a esperar con casi cualquier solución que involucre innecesariamente a jQuery. (Déjalo morir.)Existen soluciones sofisticadas que implican la utilización del navegador para intentar analizar el texto, identificando si se construyeron nodos DOM, lo que será… lento. O expresiones regulares que serán más rápidas, pero ... potencialmente inexactas. También hay dos preguntas muy distintas que surgen de este problema:
P1: ¿Una cadena contiene fragmentos HTML?
¿La cadena es parte de un documento HTML, que contiene marcas de elementos HTML o entidades codificadas? Esto se puede usar como un indicador de que la cadena puede requerir blanqueo / desinfección o decodificación de entidades:
Puede ver este patrón en uso en todos los ejemplos de todas las respuestas existentes en el momento de escribir este artículo, además de algunos ... bastante espantosos textos de muestra generados en WYSIWYG o Word y una variedad de referencias de entidades de caracteres.
P2: ¿La cadena es un documento HTML?
La especificación HTML es sorprendentemente flexible en cuanto a lo que considera un documento HTML . Los navegadores hacen todo lo posible para analizar casi cualquier texto basura como HTML. Dos enfoques: simplemente considere todo HTML (ya que si se entrega con un tipo de
text/html
contenido, el usuario-agente hará un gran esfuerzo para tratar de interpretarlo como HTML) o busque el marcador de prefijo:En términos de "buena formación", eso y casi nada más se "requiere". El siguiente es un documento HTML 100% completo y totalmente válido que contiene todos los elementos HTML que cree que se están omitiendo:
Sip. Hay reglas explícitas sobre cómo formar "faltantes" elementos tales como
<html>
,<head>
, y<body>
. Aunque me parece bastante divertido que el resaltado de sintaxis de SO no haya podido detectarlo correctamente sin una pista explícita.fuente
Mi solucion es
fuente
Hay un paquete de NPM is-html que puede intentar resolver este https://github.com/sindresorhus/is-html
fuente
<html>
y<body>
etiquetas, las cuales son completamente opcionales . La prueba "no coincide con XML" es reveladora.