Eu tenho uma determinada string para a qual quero verificar se é um html ou não. Estou usando regex para o mesmo, mas não obtive o resultado adequado.
Eu validei meu regex e ele funciona bem aqui .
var htmlRegex = new RegExp("<([A-Za-z][A-Za-z0-9]*)\b[^>]*>(.*?)</\1>");
return htmlRegex.test(testString);
Aqui está o violino, mas o regex não está sendo executado lá. http://jsfiddle.net/wFWtc/
Na minha máquina, o código funciona bem, mas obtenho um falso em vez de verdadeiro como resultado. O que estou faltando aqui?
javascript
regex
user1240679
fonte
fonte
<
e pelo menos um>
e chamá-la de HTML ou pode verificar se ela é estritamente válida com a sintaxe HTML correta ou qualquer coisa entre os dois. Para os casos mais simples, um analisador HTML não é necessário.Respostas:
A melhor regex a ser usada para verificar se uma string é HTML é:
Por exemplo:
Na verdade, é tão bom que retornará
true
para cada string passada para ele, porque cada string é HTML . Sério, mesmo que seja mal formatado ou inválido, ainda é HTML.Se o que você está procurando é a presença de elementos HTML, em vez de simplesmente qualquer conteúdo de texto, você pode usar algo como:
Não ajudará você a analisar o HTML de nenhuma forma, mas certamente sinalizará a string como contendo elementos HTML.
fonte
a < b && a > c
ser HTML?a<b && a>c
HTML ... Gostaria que a detecção de HTML pudesse ser simplificada tanto. Analisar nunca é fácil.a < b && a > c
o navegador irá transformar o>
e<
caracteres em>
e<
entidades de forma adequada. Se, em vez disso, você usara<b && a>c
o navegador interpretará a marcação comoa<b && a>c</b>
porque a falta de um espaço significa que<b
abre um<b>
elemento. Aqui está uma demonstração rápida do que estou falando .Método # 1 . Esta é a função simples para testar se a string contém dados HTML:
A ideia é permitir que o analisador DOM do navegador decida se a string fornecida se parece com um HTML ou não. Como você pode ver, ele simplesmente verifica
ELEMENT_NODE
(nodeType
de 1).Fiz alguns testes e parece que funciona:
Esta solução detectará corretamente a string HTML, no entanto, tem o efeito colateral de img / vide / etc. as tags começarão a baixar o recurso depois de analisadas no innerHTML.
Método # 2 . Outro método usa DOMParser e não tem efeitos colaterais de recursos de carregamento:
Notas:
1.
Array.from
é o método ES2015, pode ser substituído por[].slice.call(doc.body.childNodes)
.2. A função de seta na
some
chamada pode ser substituída pela função anônima usual.fonte
isHTML("</a>") --> false
).innerHTML
forçará o navegador a começar a buscar esses recursos. :(Um pouco de validação com:
Isso procura por tags vazias (algumas predefinidas) e
/
tags vazias XHTML encerradas e valida como HTML por causa da tag vazia OU irá capturar o nome da tag e tentar encontrar sua tag de fechamento em algum lugar na string para validar como HTML.Demonstração explicada: http://regex101.com/r/cX0eP2
Atualizar:
Validação completa com:
Isso faz a validação adequada , pois contém TODAS as tags HTML, as vazias primeiro, seguidas das demais que precisam de uma tag de fechamento.
Demonstração explicada aqui: http://regex101.com/r/pE1mT5
fonte
document.querySelector('strange')
- vai funcionar.A resposta do zzzzBov acima é boa, mas não leva em conta as tags de fechamento perdidas, como por exemplo:
Uma versão que também captura as tags de fechamento pode ser esta:
fonte
<[a-z/][\s\S]*>
- observe a barra no primeiro grupo.Aqui está uma linha simples que uso de vez em quando:
Basicamente, ele retornará
true
para strings contendo a<
seguido deANYTHING
seguido de>
.Por
ANYTHING
, quero dizer basicamente qualquer coisa, exceto uma string vazia.Não é ótimo, mas é uma linha única.
Uso
Como você pode ver, está longe de ser perfeito, mas pode fazer o trabalho para você em alguns casos.
fonte
Todas as respostas aqui são excessivamente inclusivas, elas apenas procuram
<
seguido por>
. Não existe uma maneira perfeita de detectar se uma string é HTML, mas você pode fazer melhor.Abaixo, procuramos as tags finais e serão muito mais rígidas e precisas:
E aqui está ele em ação:
fonte
Se você estiver criando uma regex a partir de um literal de string, será necessário escapar de qualquer barra invertida:
Isso não é necessário se você usar um literal regex, mas precisa escapar das barras:
Além disso, seu jsfiddle não funcionou porque você atribuiu um
onload
manipulador dentro de outroonload
manipulador - o padrão, conforme definido no painel Frameworks e Extensões à esquerda é envolver o JS em umonload
. Mude isso para uma opção nowrap e corrija o escape literal da string e isso "funciona" (dentro das restrições que todos apontaram nos comentários): http://jsfiddle.net/wFWtc/4/Pelo que eu sei, as expressões regulares do JavaScript não têm referências anteriores. Portanto, esta parte da sua expressão:não funcionará em JS (mas funcionará em algumas outras linguagens).fonte
<br>
<hr>
<input...>
@ user1240679?/<\/?[^>]*>/.test(str)
Detecte apenas se ele contém tags html, pode ser um xmlfonte
27 is < 42, and 96 > 42.
Isso não é HTML.Com jQuery:
fonte
isHTML("<foo>");
// retorna verdadeiroisHTML("div");
// retorna verdadeiro se houverdiv
s na página@
é uma sintaxe válida para um seletor. Portanto, quando você passa para um seletor jQuery, ele lançará uma exceção (ou seja,$("[email protected]")
de!!$(str)[0]
). Estou me referindo especificamente à!!$(str)[0]
porção. Você acabou de editar sua resposta, mas agora está verificando o HTML antes que o jQuery faça qualquer coisa.Usando jQuery neste caso, a forma mais simples seria:
Se
$(testString).length = 1
, isso significa que há uma tag HTML dentrotextStging
.fonte
$()
é uma operação de seletor CSS. Mas também uma fábrica de nós DOM da serialização de HTML textual. Mas também ... de acordo com a outra resposta que sofre da mesma dependência do jQuery, "div" não é HTML, mas retornariatrue
se algum<div>
elemento existisse na página. Essa é uma abordagem muito, muito ruim, como eu já esperava com quase todas as soluções que envolvem jQuery desnecessariamente. (Deixe morrer.)Existem soluções sofisticadas que envolvem a utilização do próprio navegador para tentar analisar o texto, identificando se algum nó DOM foi construído, o que será ... lento. Ou expressões regulares que serão mais rápidas, mas ... potencialmente imprecisas. Existem também duas questões muito distintas decorrentes deste problema:
Q1: uma string contém fragmentos HTML?
A string é parte de um documento HTML, contendo marcação de elemento HTML ou entidades codificadas? Isso pode ser usado como um indicador de que a string pode exigir branqueamento / higienização ou decodificação de entidade:
Você pode ver esse padrão em uso em todos os exemplos de todas as respostas existentes no momento em que este livro foi escrito, além de alguns ... hediondos textos de amostra gerados por WYSIWYG ou Word e uma variedade de referências a entidades de caracteres.
P2: A string é um documento HTML?
A especificação HTML é chocantemente frouxa quanto ao que considera um documento HTML . Os navegadores vão a extremos para analisar quase qualquer texto lixo como HTML. Duas abordagens: ou apenas considerar tudo HTML (já que se entregue com um
text/html
Content-Type, grande esforço será despendido para tentar interpretá-lo como HTML pelo agente do usuário) ou procurar o marcador de prefixo:Em termos de "boa formação", isso e quase nada mais é "necessário". A seguir está um documento HTML 100% completo e totalmente válido, contendo todos os elementos HTML que você acha que estão sendo omitidos:
Sim. Existem regras explícitas sobre como formar elementos "perdidos", como
<html>
,<head>
, e<body>
. Embora eu ache bastante divertido que o realce de sintaxe do SO não tenha detectado isso corretamente sem uma dica explícita.fonte
Minha solução é
fonte
Existe um pacote NPM is-html que pode tentar resolver este https://github.com/sindresorhus/is-html
fonte
<html>
e<body>
tags, sendo que ambos são totalmente opcionais . O teste "não corresponde a XML" é revelador.