如何用正则表达式批量删除含Facebook、Google等关键词的完整HTML标签
你写的正则失效的核心原因:
[\s\S]仅匹配单个任意字符,没有加量词*或+,无法匹配“face”前后的多行脚本内容- 开头的
<(.*)>用了贪婪匹配的.*,会跨标签匹配错误内容,且没有限定是script标签,匹配范围不可控
Sublime Text 调试用正则
开启Sublime的正则匹配模式后,使用如下表达式即可匹配所有包含指定跟踪代码关键词的完整script标签:
<script[^>]*>[\s\S]*?(?:fbq|facebook|gtag|dataLayer|googletag)[\s\S]*?<\/script>
各部分说明:
<script[^>]*>:精准匹配script开头标签,[^>]*避免匹配到其他标签的属性内容[\s\S]*?:非贪婪匹配任意字符(包含换行),不会跨标签吞噬正常内容(?:fbq|facebook|gtag|dataLayer|googletag):要识别的关键词列表,无需额外捕获所以用非捕获括号,需要新增识别关键词直接用|分隔即可[\s\S]*?<\/script>:非贪婪匹配到最近的script结束标签,避免跨标签匹配
调试建议:
- 替换前先点击「查找全部」,核对匹配结果均为需要删除的跟踪代码标签,再执行替换操作
- 可以根据需求拆分正则,比如仅匹配Facebook Pixel的正则可将关键词部分改为
(?:fbq|facebook),仅匹配Google Tag的改为(?:gtag|dataLayer|googletag)
phpMyAdmin 批量操作注意事项
- 操作前必须先备份完整数据库,建议先用备份数据测试替换逻辑,确认无误后再操作正式库
- MySQL 8.0+/MariaDB 10.0+版本支持
REGEXP_REPLACE函数,执行批量替换的SQL语句参考:
UPDATE 你的表名 SET 存储HTML内容的字段名 = REGEXP_REPLACE(存储HTML内容的字段名, '<script[^>]*>[\\s\\S]*?(?:fbq|facebook|gtag|dataLayer)[\\s\\S]*?</script>', '') WHERE 存储HTML内容的字段名 REGEXP '<script[^>]*>[\\s\\S]*?(fbq|facebook|gtag)[\\s\\S]*?</script>';
- 注意SQL语句里的反斜杠需要转义,所以
\s要写成\\s
内容的提问来源于stack exchange,提问作者Dg2A
相关产品推荐
相关产品推荐

