正则表达式修改求助:如何排除data-href匹配,仅匹配独立href属性
问题原因
你现有正则的核心问题是没有对属性名的前置字符做限定,只要文本中出现src=/href=这类子串就会触发匹配,不管它是不是独立的属性名,因此data-href中的href=部分会被误识别。
修改方案
对正则做两处调整即可:
- 在属性匹配分组前添加正向后顾断言
(?<=\s),要求属性名前必须是空白字符,确保匹配的是标签内独立的属性,而非长属性名的子串 - 移除属性列表中的
data项,避免匹配data开头的属性
修改后正则
/(?:(?<=\s)(?:src|href|poster|altimg)\s*=\s*)(?!['"]?(?:http|#|mailto:|data:|tel:|sms:))['"]([^'">]+)|(?:url\()(?!['"]?(?:http))['"]?([^'")]+)/gm
兼容方案(不支持后顾断言的环境)
如果运行环境不支持正则后顾断言(比如旧版JavaScript),可以用匹配前置空白符的方案替代,匹配后手动去除结果开头的空格即可:
/(?:\s(?:src|href|poster|altimg)\s*=\s*)(?!['"]?(?:http|#|mailto:|data:|tel:|sms:))['"]([^'">]+)|(?:url\()(?!['"]?(?:http))['"]?([^'")]+)/gm
内容的提问来源于stack exchange,提问作者David Faizulaev
相关产品推荐
相关产品推荐

