我有一个字符串,我想检查它是否是一个HTML.我正在使用正则表达式,但没有得到正确的结果.
我验证了我的正则表达式,它在这里工作正常.
var htmlRegex = new RegExp("<([A-Za-z][A-Za-z0-9]*)\b[^>]*>(.*?)</\1>");
return htmlRegex.test(testString);
Run Code Online (Sandbox Code Playgroud)
这是小提琴,但正则表达式没有在那里运行.http://jsfiddle.net/wFWtc/
在我的机器上,代码运行正常但我得到一个假而不是真的结果.这里缺少什么?
zzz*_*Bov 276
用于检查字符串是否为HTML的更好的正则表达式是:
/^/
Run Code Online (Sandbox Code Playgroud)
例如:
/^/.test('') // true
/^/.test('foo bar baz') //true
/^/.test('<p>fizz buzz</p>') //true
Run Code Online (Sandbox Code Playgroud)
事实上,它是那么好,它会返回true为每个传递给它的字符串,这是因为每一个字符串是HTML.说真的,即使格式不好或无效,它仍然是HTML.
如果你要找的是HTML元素的存在,而不是简单的任何文本内容,你可以使用以下内容:
/<\/?[a-z][\s\S]*>/i.test()
Run Code Online (Sandbox Code Playgroud)
它无法帮助您以任何方式解析HTML,但它肯定会将字符串标记为包含HTML元素.
dfs*_*fsq 64
方法#1.这是测试字符串是否包含HTML数据的简单函数:
function isHTML(str) {
var a = document.createElement('div');
a.innerHTML = str;
for (var c = a.childNodes, i = c.length; i--; ) {
if (c[i].nodeType == 1) return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
这个想法是允许浏览器DOM解析器决定提供的字符串是否看起来像HTML.如你所见,它只是检查ELEMENT_NODE(nodeType1).
我做了几个测试,看起来很有效:
isHTML('<a>this is a string</a>') // true
isHTML('this is a string') // false
isHTML('this is a <b>string</b>') // true
Run Code Online (Sandbox Code Playgroud)
此解决方案将正确检测HTML字符串,但它具有img/vide /等的副作用.标签将在innerHTML中解析后开始下载资源.
方法#2.另一种方法使用DOMParser并且没有加载资源的副作用:
function isHTML(str) {
var doc = new DOMParser().parseFromString(str, "text/html");
return Array.from(doc.body.childNodes).some(node => node.nodeType === 1);
}
Run Code Online (Sandbox Code Playgroud)
注意事项:
1.Array.from是ES2015方法,可以替换[].slice.call(doc.body.childNodes).
2. some调用中的箭头函数可以用通常的匿名函数替换.
CSᵠ*_*CSᵠ 14
一点点验证:
/<(?=.*? .*?\/ ?>|br|hr|input|!--|wbr)[a-z]+.*?>|<([a-z]+).*?<\/\1>/i.test(htmlStringHere)
Run Code Online (Sandbox Code Playgroud)
这会搜索空标记(某些预定义的)并/终止XHTML空标记并作为HTML验证,因为空标记或将捕获标记名称并尝试在字符串中的某处找到它的结束标记以验证为HTML.
解释演示:http://regex101.com/r/cX0eP2
更新:
完成验证:
/<(br|basefont|hr|input|source|frame|param|area|meta|!--|col|link|option|base|img|wbr|!DOCTYPE).*?>|<(a|abbr|acronym|address|applet|article|aside|audio|b|bdi|bdo|big|blockquote|body|button|canvas|caption|center|cite|code|colgroup|command|datalist|dd|del|details|dfn|dialog|dir|div|dl|dt|em|embed|fieldset|figcaption|figure|font|footer|form|frameset|head|header|hgroup|h1|h2|h3|h4|h5|h6|html|i|iframe|ins|kbd|keygen|label|legend|li|map|mark|menu|meter|nav|noframes|noscript|object|ol|optgroup|output|p|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|small|span|strike|strong|style|sub|summary|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|track|tt|u|ul|var|video).*?<\/\2>/i.test(htmlStringHere)
Run Code Online (Sandbox Code Playgroud)
这样做是正确的验证,因为它包含所有 HTML标记,空标记首先跟随其余需要结束标记的标记.
这里解释演示:http://regex101.com/r/pE1mT5
zzzzBov上面的答案很好,但它没有考虑到杂散的结束标签,例如:
/<[a-z][\s\S]*>/i.test('foo </b> bar'); // false
Run Code Online (Sandbox Code Playgroud)
同样捕获结束标记的版本可能是这样的:
/<[a-z/][\s\S]*>/i.test('foo </b> bar'); // true
Run Code Online (Sandbox Code Playgroud)
这是我不时使用的一个单调的单行:
var isHTML = RegExp.prototype.test.bind(/(<([^>]+)>)/i);
Run Code Online (Sandbox Code Playgroud)
它基本上会返回true包含<后跟ANYTHING依次为的字符串>.
通过ANYTHING,我的意思是除了一个空字符串基本上什么.
这不是很好,但它是一个单行.
用法
isHTML('Testing'); // false
isHTML('<p>Testing</p>'); // true
isHTML('<img src="hello.jpg">'); // true
isHTML('My < weird > string'); // true (caution!!!)
isHTML('<>'); // false
Run Code Online (Sandbox Code Playgroud)
正如您所看到的那样,它远非完美,但在某些情况下可能会为您完成工作.
这里所有的答案都涉及范围过大,他们只是找<其次>。没有完美的方法来检测字符串是否为HTML,但是您可以做得更好。
下面我们将寻找结束标签,它将更加紧密和准确:
import re
re_is_html = re.compile(r"(?:</[^<]+>)|(?:<[^<]+/>)")
Run Code Online (Sandbox Code Playgroud)
它在起作用:
# Correctly identified as not HTML:
print re_is_html.search("Hello, World")
print re_is_html.search("This is less than <, this is greater than >.")
print re_is_html.search(" a < 3 && b > 3")
print re_is_html.search("<<Important Text>>")
print re_is_html.search("<a>")
# Correctly identified as HTML
print re_is_html.search("<a>Foo</a>")
print re_is_html.search("<input type='submit' value='Ok' />")
print re_is_html.search("<br/>")
# We don't handle, but could with more tweaking:
print re_is_html.search("<br>")
print re_is_html.search("Foo & bar")
print re_is_html.search("<input type='submit' value='Ok'>")
Run Code Online (Sandbox Code Playgroud)