正则表达式检查某些标签

时间:2018-04-23 10:36:34

标签: javascript regex typescript tags

我想检查传递的字符串值中是否包含某些标记,或者不包括ap标记。

对于样本输入:

<p><a href="fdssadfafads" target="_blank">aaa<span>dddd</span></a>bbb</p><span>ccc</span>

结果应为:

false

因为输入包含span标记。

现在,我尝试过这样的regexp

<(?!/?(p|a)(>|\s))[^<]+?>

但它对我没用。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

你可以试试这个正则表达式:

(?<=<span>)(?:.*?)(?=<\/span>)

像这样:

regex = "(?<=<span>)(?:.*?)(?=<\/span>)";

str = "<p><a href=\"fdssadfafads\" target=\"_blank\">aaa<span>dddd</span></a>bbb</p><span>ccc</span>";
str2 = "There is no tag"

found = str.search(regex)==-1?false:true;
found2 = str2.search(regex)==-1?false:true;

document.write("'span' tags found - "+found);
document.write(" and 'span' tags found - "+found2);

说明 -

(?<=<span>) - 一个积极的后视,告诉正则表达式系统匹配文本,如果前面有<span>的话 (?:.*?) - 一个非捕获组,告诉系统开始和结束span标记之间可能有零个或多个字符
(?=<\/span>) - 肯定前瞻,确保匹配后跟</span>代码

found = str.search(regex)==-1?false:true;是三元运算符 - 如果搜索正则表达式导致-1(未找到),则结果存储false

注意 - 上面的代码在搜索输入中是否存在开启和关闭范围标签时工作正常,这就是我假设的OP需求。
但是,问题不明确,可能无法满足某些所需的规格。

答案 1 :(得分:0)

如果可以选择在没有正则表达式的情况下执行此操作(因为不建议parse html with regex),您可以使用DOMParserquerySelectorAll来获取正文中的所有元素。然后检查是否存在不是ap的元素。

&#13;
&#13;
let elms = ['p', 'a'];
let htmlInvalid = `<p><a href="fdssadfafads" target="_blank">aaa<span>dddd</span></a>bbb</p><span>ccc</span>`;
let htmlValid = `<p><a href="fdssadfafads" target="_blank">aaa`;

function isHtmlValid(strHtml, allowedElements) {
  let parser = new DOMParser();
  let doc = parser.parseFromString(strHtml, "text/html");
  let elements = doc.querySelectorAll('body *');
  for (let i = 0; i < elements.length; ++i) {
    if (allowedElements.indexOf(elements[i].nodeName.toLowerCase()) < 0) {
      return false;
    }
  }
  return true;
}

console.log(isHtmlValid(htmlInvalid, elms));
console.log(isHtmlValid(htmlValid, elms));
&#13;
&#13;
&#13;