JavaScript如何修改正则实现校验字符串是否整体被HTML标签包裹
问题原因
你当前的正则只检查字符串中是否存在HTML标签片段,没有限制整个字符串都被标签包裹,也没有对字符串首尾边界做校验,所以只要字符串里有标签片段就会返回true,自然不符合需求。
修改方案
调整正则增加首尾边界校验,同时支持成对标签、自闭合标签两种场景,修改后代码如下(可按需保留原函数名):
const containsHTML = (str) => /^<([a-z][a-z0-9]*)\b[^>]*>(?:.*<\/\1>|\s*)$/i.test(str); // 测试用例 console.log(containsHTML('<br>s')) // 输出 false,符合预期 console.log(containsHTML('<br>')) // 输出 true console.log(containsHTML('<p>测试文本</p>')) // 输出 true console.log(containsHTML('前缀<p>测试</p>')) // 输出 false
正则说明
^和$分别匹配字符串的开头和结尾,确保校验覆盖完整字符串<([a-z][a-z0-9]*)\b[^>]*>匹配合法的HTML开标签,同时将标签名捕获到分组1- 非捕获分组
(?:.*<\/\1>|\s*)兼容两种合法场景:- 成对标签场景:任意中间内容 + 和分组1对应的闭合标签
- 自闭合标签场景:开标签后没有有效内容,仅允许存在空白字符
如果不需要支持自闭合标签,仅需要校验成对标签包裹的情况,可简化正则为:
const containsHTML = (str) => /^<([a-z][a-z0-9]*)\b[^>]*>.*<\/\1>$/i.test(str);
内容的提问来源于stack exchange,提问作者Asking
相关产品推荐
相关产品推荐

