Regex、PHP与WordPress插件:正则表达式无法正常工作求助
解决WordPress插件中HTML标签包裹内容的正则匹配问题
我之前也踩过WP插件正则匹配的类似坑,给你几个针对性的解决思路,应该能搞定:
修正转义逻辑,区分HTML编码和正则转义
你现在写的\<是把HTML转义后的<当作匹配目标,但实际你要抓取的是原始的<字符。问题出在WP插件的输入框可能会自动处理HTML特殊字符,或者和在线工具的解析逻辑不一样。
试试两种调整方式:- 直接用正则转义的
<(也就是\<),正则改成:(\<!-- Facebook Comments Plugin for WordPress).+?(\<\/comments\>) - 如果插件输入框会自动转义HTML,那直接写原始标签字符就行,不用额外转义:
(<!-- Facebook Comments Plugin for WordPress).+?(</comments>)
- 直接用正则转义的
解决跨换行匹配的问题
在线工具默认可能开启了「匹配换行」的选项(s修饰符),但WPEMatico这类插件大概率没开,导致.+?没法匹配换行后的内容,进而报错。
把.换成[\s\S](匹配所有空白和非空白字符),正则改成:(\<!-- Facebook Comments Plugin for WordPress)[\s\S]+?(\<\/comments\>)要是插件支持修饰符,也可以在正则末尾加
/s(比如/你的正则内容/s),不过得先确认插件认这种写法。排查插件的正则限制
有些WP插件对正则有特殊限制:比如不支持捕获组(你现在用了()),或者会吃掉反斜杠。- 先去掉捕获组试试,直接匹配整个要删除的块:
\<!-- Facebook Comments Plugin for WordPress[\s\S]+?\<\/comments\> - 要是反斜杠被吃掉,就双重转义,用
\\<代替\<:(\\<!-- Facebook Comments Plugin for WordPress)[\\s\\S]+?(\\<\\/comments\\>)
- 先去掉捕获组试试,直接匹配整个要删除的块:
分步测试定位问题
先写个极简版正则,比如只匹配开头的注释标签:\<!-- Facebook Comments Plugin for WordPress如果这个能正常匹配,再逐步加上后面的内容,就能快速找到是哪部分出了问题。
内容的提问来源于stack exchange,提问作者Matan
相关产品推荐
相关产品推荐

