检查字符串是否为html

use*_*679 84 javascript regex

我有一个字符串,我想检查它是否是一个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元素.

  • 老实说我很惊讶我没有得到更多的暗示. (26认同)
  • @clenemt,你认为`a <b && a> c`是HTML吗? (7认同)
  • 唉,我投了反对票,我就陷入了恶毒之中。有两个不同的问题,看似都得到了回答,但实际上它们截然不同。“此文本是否包含任何类型的 HTML 标记”→“它是否包含 `&lt;[a-zA-Z]` 最后跟一个 `&gt;`”,就这样。第二:字符串是HTML文档吗?它以“&lt;!DOCTYPE html&gt;”开头吗?[因为:](https://tomhodgins.hashnode.dev/code-that-you-just-never-ever-need-to-write-cjpblnfff00km0ys149kbttbg) `&lt;!DOCTYPE html&gt;&lt;title&gt;是的,真的。&lt;/ title&gt;&lt;p&gt;这就是一个完全有效、完整的 HTML 文档所需的一切。` (5认同)
  • @oriadam,上下文用于检测那种情况下的元素.如果使用`a <b && a> c`,浏览器会将`>`和`<`字符适当地转换为`&gt;`和`&lt;`实体.相反,如果您使用`a <b && a> c`,浏览器会将标记解释为"a <b && a> c </ b>",因为缺少空格意味着`<b`打开一个` <b>`元素.[这里是我正在谈论的快速演示](https://jsfiddle.net/utf9027v/). (2认同)
  • 这可能是我所看到的投票最高的巨魔答案。;) (2认同)

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调用中的箭头函数可以用通常的匿名函数替换.

  • 很好的解决方案!唯一的负面影响是,如果您的html包含任何静态资源,如图像src属性.`innerHTML`将强制浏览器开始获取这些资源.:( (9认同)
  • 这是一个很棒的主意.但是,此函数无法检测结束标记(即`isHTML("</a>") - > false`). (2认同)
  • @kuus 是的,即使不附加。使用 DOMParser 解决方案。 (2认同)

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


Aeo*_*ime 8

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)


Joh*_*mar 6

这是我不时使用的一个单调的单行:

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)

正如您所看到的那样,它远非完美,但在某些情况下可能会为您完成工作.

  • 正是我所需要的。没什么特别的,就是干净。谢谢! (2认同)

spe*_*ane 5

这里所有的答案都涉及范围过大,他们只是找<其次>。没有完美的方法来检测字符串是否为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 &amp; bar")
print re_is_html.search("<input type='submit' value='Ok'>")
Run Code Online (Sandbox Code Playgroud)