$re = '~^https?://[^/]+/item/(\d+)\.html$~u';
if (preg_match($re, $url, $m)) { echo $m[1]; }
else { var_dump(preg_last_error_msg()); }

复制来的正则放进 preg_match 后直接返回 false,并提示编译失败,同样的表达式在别的语言里能用。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:PHP 正则要求成对分隔符,且表达式里的斜杠需要转义,原表达式没有带分隔符。

「PHP 正则编译失败」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。改完隔一天再看一次,当场正常不代表能稳住。

测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

处理上按这个顺序:给表达式加上统一分隔符;转义内部相同的字符;用 preg_last_error 确认失败原因。

确认没问题再收工,匹配结果正确返回分组,非法输入返回 false 且错误信息明确。

作者 9823189