检查字符串是否为 html

2022-08-30 04:22:08

我有一个特定的字符串,我想检查它是否是html。我正在使用正则表达式进行相同的操作,但没有得到正确的结果。

我验证了我的正则表达式,它在这里工作正常。

var htmlRegex = new RegExp("<([A-Za-z][A-Za-z0-9]*)\b[^>]*>(.*?)</\1>");
return htmlRegex.test(testString);

这是小提琴,但正则表达式没有在那里运行。http://jsfiddle.net/wFWtc/

在我的机器上,代码运行良好,但我得到一个假而不是true作为结果。这里缺少什么?


答案 1

用于检查字符串是否为HTML的更好的正则表达式是:

/^/

例如:

/^/.test('') // true
/^/.test('foo bar baz') //true
/^/.test('<p>fizz buzz</p>') //true

事实上,它是如此之好,以至于它会为传递给它的每个字符串返回,这是因为每个字符串都是HTML。说真的,即使它的格式很差或无效,它仍然是HTML。true

如果你正在寻找的是HTML元素的存在,而不仅仅是任何文本内容,你可以使用如下内容:

/<\/?[a-z][\s\S]*>/i.test()

它不会以任何方式帮助您解析HTML,但它肯定会将字符串标记为包含HTML元素。


答案 2

方法#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;
}

这个想法是允许浏览器DOM解析器决定提供的字符串是否看起来像HTML。如您所见,它只是检查( of 1)。ELEMENT_NODEnodeType

我做了几个测试,看起来它的工作原理:

isHTML('<a>this is a string</a>') // true
isHTML('this is a string')        // false
isHTML('this is a <b>string</b>') // true

此解决方案将正确检测HTML字符串,但是它具有副作用,即在innerHTML中解析后,img / vide /等标记将开始下载资源。

方法#2。另一种方法使用 DOMParser 并且没有加载资源的副作用:

function isHTML(str) {
  var doc = new DOMParser().parseFromString(str, "text/html");
  return Array.from(doc.body.childNodes).some(node => node.nodeType === 1);
}

注意:
1. Array.from 是 ES2015 方法,可以替换为 [].slice.call(doc.body.childNodes).
2.箭头函数在某些调用中可以替换为通常的匿名函数。