匹配HTML标记的正则表达式 |
|
先说说网上流传的版本: |
<(\S*?)[^>]*>.*?</\1>|<.*? /> |
*? *表示0个或多个,?表示0个或1个,两个叠加起来标识0个多个,与*的功能重叠 |
(\S*?) 标签的长度必须大于0,因此不能用*? |
|<.*?\/> 没有分组,无法获取以<div/>这种自关闭格式书写的标签 |
</\1> |
<.*? /> 有的标签是不关闭的,比如<br><hr>,因此不能强制关闭 |
修正如下: |
var rtag = /^<([a-z]+)\s*\/?>.*(?:<\/\1>)?$/i |
rtag.exec( '<-div></-div>' ) // null |
rtag.exec( '<div>abc' ) // ["<div>abc", "div"] |
这个表达式也不完善,比如第二条测试语句,这么写是为了能提取中包含了文本内容的标签,如果要严格匹配,可再次修改为: |
var rtag = /^<([a-z]+)\s*\/?> (?:<\/\1>)?$/i // 去掉了中间的.* |
这个正则的应用范围仅限于简单的标签匹配、提取,不能匹配嵌套标记。 |