需求:匹配"my company"但排除img和a标签内容的正则表达式
解决匹配"my company"并排除img/a标签内容的正则方案
我看你现在的正则没能正确排除img标签属性里的内容,比如figtitle里的"my company"也被误匹配了——这是因为原来的正则逻辑没覆盖到整个img标签的范围,也没处理好a标签的完整内容。给你两个更可靠的方案,适配不同的运行环境:
方案一:支持PCRE的环境(比如PHP、Regexr切换到PCRE模式)
用(*SKIP)(*FAIL)技巧先跳过所有img和a标签,再匹配目标文本:
(<img\b[^>]*>|<a\b[^>]*>.*?</a>)(*SKIP)(*FAIL)|my company
记得加上i修饰符(实现不区分大小写匹配)。
工作原理拆解:
<img\b[^>]*>:精准匹配所有自闭合的img标签(包括里面的所有属性内容),确保标签内的文本直接被跳过。<a\b[^>]*>.*?</a>:匹配完整的a标签(从起始标签到闭合标签),非贪婪的.*?避免误匹配多个a标签的内容。(*SKIP)(*FAIL):告诉正则引擎跳过这些匹配到的标签内容,不再参与后续的匹配检查。|my company:匹配所有不在上述标签范围内的"my company"文本。
用你的测试字符串验证的话,只会匹配到img标签后面、a标签前面的那个my company,img的figtitle和a标签内的内容都会被正确排除。
方案二:JavaScript环境(不支持(*SKIP)(*FAIL))
如果是在JavaScript里使用,可以用负向环视来实现需求:
my company(?!(?<=<img\b[^>]*).*?>)(?!(?<=<a\b[^>]*).*?</a>)
加上gi修饰符(全局匹配+不区分大小写)。
工作原理拆解:
(?!(?<=<img\b[^>]*).*?>):确保当前的"my company"不在img标签的属性范围内。(?!(?<=<a\b[^>]*).*?</a>):确保当前的"my company"不在a标签的内容范围内。
这样也能达到排除img和a标签内内容的效果。
内容的提问来源于stack exchange,提问作者Bhatu Pawar
相关产品推荐
相关产品推荐

