【问题标题】:PHP preg_match Matching Wrong StringPHP preg_match 匹配错误的字符串
【发布时间】:2014-03-01 09:41:54
【问题描述】:

我有一个正则表达式:

/\/(register)(?:\/activate\/(.{16}))?(?:\/(student|teacher|org))?\/?$/

正确匹配字符串:

/register
/register/student
/register/activate/1234567890123456/

不匹配问题:

/register/register/register/register/student/

在 PHP 中使用 preg_match 时,上述内容仍然匹配。有其他选择吗?

我也尝试过将“注册”限制为 1:

\/((?:register){1})(?:\/activate\/(.{16}))?(?:\/(student|teacher|org))?\/?$

运气不好。

使用 Debuggex 不匹配,但使用 http://www.phpliveregex.com/ 匹配

Debuggex Demo

【问题讨论】:

    标签: php regex preg-match


    【解决方案1】:

    在字符串的开头使用 ^ 来锚定它。

    /^\/(register)(?:\/activate\/(.{16}))?(?:\/(student|teacher|org))?\/?$/
     * here
    

    在开始时不使用锚点实际上匹配如下:

    /register/register/register/register/student/
                               ^----------------^
    

    【讨论】:

    • 哦,是的,谢谢!我在所有其他表达式上都有这个,我猜它在经过多次编辑后以某种方式被删除了。
    • 另外,使用另一个字符,例如 ~ 或 #,来分隔您的模式。这样您就不必转义模式中的所有 /:"~/(register)(?:/activate/(.{16}))?(?:/(student|teacher|org))?/?$~"
    【解决方案2】:

    问题是您只是尝试使用$ 匹配字符串的结尾。这意味着正则表达式将匹配您的表达式,无论它前面是什么。

    有一个表达式 /bob$/ 将匹配以 bob 结尾的所有内容,例如big bob。这正是这里发生的事情。

    您需要强制preg_match 匹配整个字符串(即开头和结尾),方法是在其前面加上^

    /^\/(register)(?:\/activate\/(.{16}))?(?:\/(student|teacher|org))?\/?$/
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-26
      • 2015-06-27
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      相关资源
      最近更新 更多