J'ai une certaine chaîne pour laquelle je veux vérifier si c'est un html ou non. J'utilise regex pour le même mais n'obtiens pas le bon résultat.
J'ai validé mon regex et cela fonctionne très bien ici .
var htmlRegex = new RegExp("<([A-Za-z][A-Za-z0-9]*)\b[^>]*>(.*?)</\1>");
return htmlRegex.test(testString);
Voici le violon, mais l'expression régulière ne fonctionne pas là-dedans. http://jsfiddle.net/wFWtc/
Sur ma machine, le code fonctionne bien mais j'obtiens un faux au lieu de vrai comme résultat. Que manque-t-il ici?
javascript
regex
user1240679
la source
la source
<
et au moins un>
et l'appeler HTML, ou vous pouvez vérifier qu'elle est strictement valide avec une syntaxe HTML correcte, ou quoi que ce soit entre les deux. Pour le plus simple des cas, un analyseur HTML n'est pas nécessaire.Réponses:
Une meilleure regex à utiliser pour vérifier si une chaîne est HTML est:
Par exemple:
En fait, c'est tellement bon, qu'il retournera
true
pour chaque chaîne qui lui est passée, car chaque chaîne est HTML . Sérieusement, même s'il est mal formaté ou invalide, c'est toujours du HTML.Si ce que vous recherchez est la présence d'éléments HTML, plutôt que simplement du contenu textuel, vous pouvez utiliser quelque chose du genre:
Cela ne vous aidera en aucun cas à analyser le HTML, mais cela marquera certainement la chaîne comme contenant des éléments HTML.
la source
a < b && a > c
donc comme du HTML?a<b && a>c
être du HTML ... Je souhaite que la détection HTML puisse être simplifiée à ce point. L'analyse n'est jamais facile.a < b && a > c
le navigateur, les caractères>
et seront transformés<
en entités>
et de<
manière appropriée. Si, à la place, vous utiliseza<b && a>c
le navigateur interprétera le balisage commea<b && a>c</b>
parce que le manque d'espace signifie que cela<b
ouvre un<b>
élément. Voici une rapide démonstration de ce dont je parle .Méthode n ° 1 . Voici la fonction simple pour tester si la chaîne contient des données HTML:
L'idée est de permettre à l'analyseur DOM du navigateur de décider si la chaîne fournie ressemble ou non à un HTML. Comme vous pouvez le voir, il vérifie simplement
ELEMENT_NODE
(nodeType
sur 1).J'ai fait quelques tests et il semble que cela fonctionne:
Cette solution détectera correctement la chaîne HTML, mais elle a un effet secondaire qui img / vide / etc. Les balises commenceront à télécharger la ressource une fois analysées dans innerHTML.
Méthode n ° 2 . Une autre méthode utilise DOMParser et n'a pas d'effets secondaires de chargement des ressources:
Remarques:
1.
Array.from
est la méthode ES2015, peut être remplacée par[].slice.call(doc.body.childNodes)
.2. La fonction de flèche dans l'
some
appel peut être remplacée par la fonction anonyme habituelle.la source
isHTML("</a>") --> false
).innerHTML
forcera le navigateur à commencer à récupérer ces ressources. :(Un peu de validation avec:
Cela recherche des balises vides (certaines prédéfinies) et
/
des balises vides XHTML terminées et valide en HTML à cause de la balise vide OU capture le nom de la balise et tente de trouver sa balise de fermeture quelque part dans la chaîne pour la valider en HTML.Démo expliquée: http://regex101.com/r/cX0eP2
Mettre à jour:
Validation complète avec:
Cela fait une validation correcte car il contient TOUTES les balises HTML, les vides en premier, suivies par les autres qui nécessitent une balise de fermeture.
Démo expliquée ici: http://regex101.com/r/pE1mT5
la source
document.querySelector('strange')
- cela fonctionnera.La réponse de zzzzBov ci-dessus est bonne, mais elle ne tient pas compte des balises de fermeture parasites, comme par exemple:
Une version qui capture également les balises de fermeture pourrait être la suivante:
la source
<[a-z/][\s\S]*>
- notez la barre oblique dans le premier groupe.Voici un sloppy one-liner que j'utilise de temps en temps:
Il retournera essentiellement
true
pour les chaînes contenant un<
suivi deANYTHING
suivi de>
.Par
ANYTHING
, je veux dire essentiellement tout sauf une chaîne vide.Ce n'est pas génial, mais c'est une ligne unique.
Usage
Comme vous pouvez le voir, c'est loin d'être parfait, mais pourrait faire le travail pour vous dans certains cas.
la source
Toutes les réponses ici sont trop inclusives, elles recherchent simplement
<
suivies de>
. Il n'y a pas de moyen parfait de détecter si une chaîne est HTML, mais vous pouvez faire mieux.Ci-dessous, nous recherchons des balises de fin , et seront beaucoup plus serrées et plus précises:
Et le voici en action:
la source
Si vous créez une expression régulière à partir d'une chaîne littérale, vous devez échapper à toute barre oblique inverse:
Ce n'est pas nécessaire si vous utilisez un littéral regex, mais vous devez ensuite échapper les barres obliques:
De plus, votre jsfiddle n'a pas fonctionné parce que vous avez affecté un
onload
gestionnaire dans un autreonload
gestionnaire - la valeur par défaut définie dans le panneau Frameworks & Extensions sur la gauche consiste à envelopper le JS dans un fichieronload
. Changez cela en une option nowrap et corrigez la chaîne littérale qui s'échappe et cela "fonctionne" (dans les limites que tout le monde a indiquées dans les commentaires): http://jsfiddle.net/wFWtc/4/Pour autant que je sache, les expressions régulières JavaScript n'ont pas de références arrière. Donc cette partie de votre expression:ne fonctionnera pas dans JS (mais fonctionnera dans d'autres langues).la source
<br>
<hr>
<input...>
@ user1240679?/<\/?[^>]*>/.test(str)
Détecter uniquement s'il contient des balises html, peut être un xmlla source
27 is < 42, and 96 > 42.
Ce n'est pas du HTML.Avec jQuery:
la source
isHTML("<foo>");
// renvoie trueisHTML("div");
// renvoie true s'il y a desdiv
s sur la page@
n'est pas une syntaxe valide pour un sélecteur. Ainsi, lorsque vous le passez à un sélecteur jQuery, il lèvera une exception (ie$("[email protected]")
from!!$(str)[0]
). Je parle spécifiquement de la!!$(str)[0]
partie. Vous venez de modifier votre réponse, mais vous vérifiez maintenant le HTML avant que jQuery ne fasse quoi que ce soit.En utilisant jQuery dans ce cas, la forme la plus simple serait:
Si
$(testString).length = 1
, cela signifie qu'il y a une balise HTML à l'intérieurtextStging
.la source
$()
est une opération de sélection CSS. Mais aussi une fabrique de nœuds DOM à partir de la sérialisation HTML textuelle. Mais aussi… selon l'autre réponse souffrant de la même dépendance sur jQuery, "div" n'est pas du HTML, mais cela reviendraittrue
si des<div>
éléments existent sur la page. C'est une très, très mauvaise approche, comme je m'y attendais avec presque toutes les solutions impliquant inutilement jQuery. (Laissez-le mourir.)Il existe des solutions sophistiquées impliquant l'utilisation du navigateur lui-même pour tenter d'analyser le texte, en identifiant si des nœuds DOM ont été construits, ce qui sera… lent. Ou des expressions régulières qui seront plus rapides, mais… potentiellement inexactes. Deux questions très distinctes se posent également à propos de ce problème:
Q1: Une chaîne contient-elle des fragments HTML?
La chaîne fait-elle partie d'un document HTML, contenant un balisage d'élément HTML ou des entités codées? Cela peut être utilisé comme un indicateur que la chaîne peut nécessiter un blanchiment / désinfection ou un décodage d'entité:
Vous pouvez voir ce modèle utilisé contre tous les exemples de toutes les réponses existantes au moment de la rédaction de cet article, ainsi que quelques exemples de texte ... plutôt hideux générés par WYSIWYG ou Word et une variété de références d'entités de caractères.
Q2: La chaîne est-elle un document HTML?
La spécification HTML est incroyablement lâche quant à ce qu'elle considère comme un document HTML . Les navigateurs vont à l'extrême pour analyser presque tous les textes inutiles au format HTML. Deux approches: soit simplement considérer tout HTML (car s'il est livré avec un
text/html
Content-Type, un gros effort sera dépensé pour essayer de l'interpréter comme HTML par l'agent utilisateur) ou rechercher le marqueur de préfixe:En termes de "bonne formation", cela, et presque rien d'autre n'est "requis". Ce qui suit est un document HTML 100% complet et entièrement valide contenant tous les éléments HTML que vous pensez être omis:
Ouaip. Il existe des règles explicites sur la façon de former des éléments « manquants » tels que
<html>
,<head>
et<body>
. Bien que je trouve plutôt amusant que la coloration syntaxique de SO n'ait pas réussi à détecter cela correctement sans un indice explicite.la source
Ma solution est
la source
Il existe un package NPM is-html qui peut tenter de résoudre ce problème https://github.com/sindresorhus/is-html
la source
<html>
et<body>
balises, qui sont tous deux entièrement facultatifs . Le test "pas de correspondance XML" est révélateur.