如果封闭的html标记与在JavaScript中传递的特定文本中的开放标记匹配,我想提出正则表达式返回true。如果有不匹配的标记,则应返回false;
例如,如果传递以下文本"<div>Test</div>"
,则应返回true
但如果以下文本传递"<div>Test</div><div>Boom"
,则应返回false
我只能将它与第一个div标签匹配,并使用以下表达式返回true
var text = "<div>Test</div>;
var text2 = "<div>Test</div><div>;
var regex = /[^<>]*<(\w+)(?:(?:\s+\w+(?:\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)>[^<>]*<\/\1+\s*>[^<>]*|[^<>]*<\w+(?:(?:\s+\w+(?:\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)\/>[^<>]*|<!--.*?-->|^[^<>]+$/;
var match = regex.test(text);
console.log(match); // true
var match = regex.test(text2);
console.log(match2); // still true should be false
如何修复它,使其按照我想要的方式运行。
答案 0 :(得分:2)
test
方法对match2
返回true,因为找到匹配。
为了解决这个问题,请以这种方式更改正则表达式:
^(?:<(\w+)(?:(?:\s+\w+(?:\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)>[^<>]*<\/\1+\s*>|<\w+(?:(?:\s+\w+(?:\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)\/>|<!--.*?-->|[^<>]+)*$
正则表达式首先定义所有允许的模式:
<tag>...</tag>
<tag/>
(此处我们可以在/
之前找到零或更多间隔)<!-- ... -->
<
或>
。然后这些模式在测试字符串的开头和结尾之间可以出现零次或多次:^(?:pattern1|pattern2|pattern3|pattern4)*$
。