如何用正则忽略HTML<a>标签内容,移除字符串末尾_数字后缀
移除字符串末尾“_+数字”后缀但保留标签内的对应模式
问题场景
需要移除字符串末尾的_+数字后缀,但所有标签(包括其href等属性、内部文本)里的该模式必须保留。比如:
this is my string_1234 <a href="link_1234">this is my html nested string_1234</a>
用#\_(\d+)$#直接替换会误删标签属性里的_1234,得只处理标签外的内容。
解决方案
利用正则的(*SKIP)(*FAIL)机制跳过所有标签内容,只匹配并替换标签外的目标后缀:
正则表达式
#<a\b[^>]*>.*?</a>(*SKIP)(*FAIL)|_(\d+)$#sm
代码示例(PHP)
$input = 'this is my string_1234 <a href="link_1234">this is my html nested string_1234</a>'; // 执行替换 $output = preg_replace('#<a\b[^>]*>.*?</a>(*SKIP)(*FAIL)|_(\d+)$#sm', '', $input); echo $output;
输出结果
this is my string <a href="link_1234">this is my html nested string_1234</a>
正则解释
<a\b[^>]*>.*?</a>:匹配完整的标签,包括属性和内部文本(*SKIP)(*FAIL):告诉正则引擎跳过这部分内容,不做任何替换|:逻辑或,匹配标签外的_(\d+)$(末尾的下划线加数字序列)s修饰符:让.匹配换行符,支持跨多行的标签m修饰符:让$匹配每行的末尾(如果不需要处理每行,只处理整个字符串末尾,可以去掉m)
内容的提问来源于stack exchange,提问作者bluantinoo
相关产品推荐
相关产品推荐

