正则表达式匹配打开和关闭的html标记

时间:2014-01-16 02:39:14

标签: javascript regex

如果封闭的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

如何修复它,使其按照我想要的方式运行。

1 个答案:

答案 0 :(得分:2)

test方法对match2返回true,因为找到匹配

为了解决这个问题,请以这种方式更改正则表达式:

^(?:<(\w+)(?:(?:\s+\w+(?:\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)>[^<>]*<\/\1+\s*>|<\w+(?:(?:\s+\w+(?:\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)\/>|<!--.*?-->|[^<>]+)*$

描述(点击放大)

Regular expression visualization

演示

http://jsfiddle.net/r2LsN/

讨论

正则表达式首先定义所有允许的模式:

  1. 带正文的标签:<tag>...</tag>
  2. 没有正文的代码:<tag/>(此处我们可以在/之前找到零或更多间隔)
  3. 评论<!-- ... -->
  4. 任何非<>
  5. 的文字

    然后这些模式在测试字符串的开头和结尾之间可以出现零次或多次:^(?:pattern1|pattern2|pattern3|pattern4)*$

相关问题