PHP正则匹配字符串中日期失败问题求助
问题分析与解决
我一眼就找到问题所在啦——你的正则表达式犯了一个常见的语法错误:定界符未转义!
问题根源
你用了/作为正则表达式的定界符,但在模式内部的[- /.]里直接使用了/(日期的分隔斜杠),这会让PHP误以为正则表达式在这里就结束了,导致整个模式语法无效。preg_match遇到无效正则时会返回false,自然就触发了else分支,返回"No date found."。
修正方案
有两种简单的解决办法:
1. 转义模式中的/
把正则里的[- /.]修改为[- \/.],让PHP把斜杠当作普通字符处理:
function matchDate($str) { if (preg_match('/\b(0?[1-9]|1[012])[- \/.](0?[1-9]|[12][0-9]|3[01])[- \/.](19|20)?[0-9]{2}\b/', $str, $mDdate)) { return $mDdate[0]; } else { return "No date found."; } } $str = "FISH HOUSE KINGS FISH HOUSE 100 W Broadway Long Beach, Ca. 90802 562-432-7463 Server: Ezbeth 07/02/2016 ..."; echo matchDate($str); // 输出:07/02/2016
2. 更换定界符
如果不想频繁转义,可以换一个不冲突的定界符,比如#或~,这样模式里的/就不需要转义了:
function matchDate($str) { if (preg_match('#\b(0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.](19|20)?[0-9]{2}\b#', $str, $mDdate)) { return $mDdate[0]; } else { return "No date found."; } }
额外提示
你可以通过preg_last_error()函数查看正则匹配的错误信息,下次遇到类似问题时,用它来快速定位语法问题:
if (preg_match(...) === false) { echo preg_last_error_msg(); // 会输出:Unknown modifier '/' }
内容的提问来源于stack exchange,提问作者santa
相关产品推荐
相关产品推荐

