正则表达式HTML标记javascript

时间:2016-11-26 22:29:38

标签: javascript html regex tags

我想验证输入的代码是否为HTML代码(必须以<html>开头并以</html>结尾)

我尝试这样做

var reghtml = new RegExp("(<html>*\n+</html>)");

但我有一个问题需要在代码中生成一个\ n,我需要验证第一个和结束标记(= <html></html>),如果他们在它们之间做了什么,必须以<开头并以>

结尾

有什么解决方案吗?

2 个答案:

答案 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>,因为您可以删除整个结束标记检查模式部分。

&#13;
&#13;
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;
&#13;
&#13;