1

正则表达式有点麻烦。我正在尝试测试匹配,但前提是没有任何内容跟随它。所以在下面的例子中,如果我去 test/create/1/2 - 它仍然匹配。我只想匹配它是否明确地 test/create/1 (但那个是动态的)。

if(preg_match('^test/create/(.*)^', 'test/create/1')):
    // do something...
endif;

我找到了一些建议在分隔符之前使用 $ 的答案,但它似乎没有做任何事情。或者是 ^ 和 $ 的组合,但我不太明白。正则表达式把我搞糊涂了!

编辑:

我并没有很好地解释这一点,所以只是澄清一下:

如果 URL 是 test/create/{id},我需要 if 语句返回 true - {id} 是动态的(并且是任何长度)。如果 {id} 后跟正斜杠,则 if 语句应该失败。因此,如果有人输入 test/create/1/2 - 它会因为 1 之后的正斜杠而失败。

解决方案

我最终选择了 thedarkwinter 的答案,因为它对我来说最有效,尽管其他答案也确实有效。

我还必须在正则表达式中添加一些额外的内容,以确保它也可以与连字符一起使用,因此最终代码如下所示:

if(preg_match('^test/create/[\w-]*$^', 'test/create/1')):
        // do something...
endif;
4

5 回答 5

4

/w 匹配单词字符,$ 匹配字符串结尾

if(preg_match('^test/create/\w*$^', 'test/create/1'))

将匹配 test/create/[word/num] 并且没有任何后续。

我想这就是你所追求的。

编辑在 \w* 中添加 *

于 2013-08-27T15:35:41.563 回答
3

使用以下正则表达式(用于$表示输入的结束):

'|test/create/[^/]+$|'

如果您只想匹配数字,请改用以下方式(\d匹配数字字符):

'^test/create/\d+$^'
于 2013-08-27T15:30:17.860 回答
3

干得好:

"/^test\\/create\\/([^\\/]*)$/"

这表示:以“test”开头的字符串后跟一个正斜杠(记住第一个反斜杠转义了第二个,因此 PHP 在输入中放置了一个字母反斜杠,它将 / 转义为正则表达式),然后是 create,后跟一个正斜杠by 并捕获不是斜线的所有内容,然后是字符串的结尾。

如果您需要更多详细信息,请发表评论

我更喜欢我的表达式总是以 / 开头,因为它作为正则表达式字符没有任何意义,我见过 @ 使用过,我相信其他一些答案使用 ^,这意味着“字符串开头”所以我不会用它作为我的正则表达式分隔符。

于 2013-08-27T15:30:55.267 回答
1

^ 是行首的锚点,即在 ^ 之前没有字符。使用 $ 来指定字符串的结尾或行的结尾。

编辑:也想添加一个建议:

您的解决方案很好并且有效,但就风格而言,我建议不要使用克拉(^)作为分隔符 - 特别是因为它具有特殊含义作为否定或作为行锚的开始,所以它有点令人困惑那样读。您可以合法地使用大多数特殊字符,只要它们不在正则表达式本身中出现(或被转义)。只是在这里谈论风格/可维护性的问题。

当然,几乎每个潜在的分隔符都有一些特殊的含义,但你也经常会在正则表达式的开头看到 ^,所以我可能会选择另一种选择。例如 # 在这里是一个不错的选择:

if(preg_match('#test/create/[\w-]*$#', $mystring)) {
 //etc
}
于 2013-08-27T15:30:30.097 回答
0

只有当它是最后一个字符串时,正则表达式abc$才会匹配。abc

abcd # no match
dabc # match
abc # match
于 2013-08-27T15:30:24.230 回答