我想检查传递的字符串值中是否包含某些标记,或者不包括a
和p
标记。
对于样本输入:
<p><a href="fdssadfafads" target="_blank">aaa<span>dddd</span></a>bbb</p><span>ccc</span>
结果应为:
false
因为输入包含span
标记。
现在,我尝试过这样的regexp:
<(?!/?(p|a)(>|\s))[^<]+?>
但它对我没用。
任何帮助都将不胜感激。
答案 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),您可以使用DOMParser和querySelectorAll来获取正文中的所有元素。然后检查是否存在不是a
或p
的元素。
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;