我想验证输入的代码是否为HTML代码(必须以<html>
开头并以</html>
结尾)
我尝试这样做
var reghtml = new RegExp("(<html>*\n+</html>)");
但我有一个问题需要在代码中生成一个\ n,我需要验证第一个和结束标记(= <html>
和</html>
),如果他们在它们之间做了什么,必须以<
开头并以>
有什么解决方案吗?
答案 0 :(得分:2)
您不应该使用正则表达式来验证HTML(更不用说解析它),因为HTML不是“Regular Language”。
所以这里是一个假阴性案例的例子,它会导致你写的任何正则表达式试图验证HTML以将其标记为无效:
<html>
<head>
<!-- </html> -->
</head>
<body>
<p>This is valid HTML</p>
</body>
</html>
由于您可以在HTML(以及SGML和XML)中嵌套注释,因此无法为此特定情况编写简单的正则表达式:
<html>
<head>
<!-- <!-- <!-- <!-- </html> -->
</head>
<body>
<p>This is valid HTML</p>
</body>
</html>
这是假阳性(假设您不使用^$
正则表达式锚点):
<p>illegal element</p>
<html>
<img>illegal text node</img>
</html>
<p>another illegal element</p>
当然,有更强大的正则表达式实现可以为计数深度等事物添加基本的支持,但是你会陷入伤害的世界。
验证HTML的正确方法是使用HTML DOM库。在.NET中,这是HtmlAgilityPack。在基于浏览器的JavaScript中,它甚至更简单:只需使用浏览器的内置解析器(innerHTML
):
(从Check if HTML snippet is valid with Javascript被盗)
function isValidHtml(html) {
var doc = document.implementation.createHTMLDocuiment("");
doc.documentElement.innerHTML = html;
return ( doc.documentElement.innerHTML === html );
}
答案 1 :(得分:1)
这里有一个模式。它检查第一级是否具有有效的开始和结束标记。第一级必须有结束标记,您不能<html><img /></html>
,因为您可以删除整个结束标记检查模式部分。
var validHtml = '\
<html itemscope>\
<head></head>\
<body style="background: red;">\
Everything is fine\
</body>\
</html>\
',
invalidHtml = '\
<html itemscope>\
<head></foot>\
<body>\
Nothing is fine\
</body>\
</html>\
',
pattern = /^\s*<html(?:\s[^>]*)?>(?:\s*<(\w+)(?:\s[^>]+)?>(?:.|\s)*<\/\1>\s*)*<\/html>\s*$/i;
console.log(pattern.test(validHtml) ? 'valid' : 'invalid');
console.log(pattern.test(invalidHtml) ? 'valid' : 'invalid');
&#13;