正则表达式有点麻烦。我正在尝试测试一场比赛,但前提是没有任何内容。所以在下面的例子中,如果我去测试/创建/ 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之后的正斜杠而失败。
解决方案
我最终选择了thewarkwinter的答案,因为它对我来说效果最好,尽管其他答案也有效。
我还必须在正则表达式中添加一些额外内容,以确保它也适用于连字符,所以最终代码看起来像这样:
if(preg_match('^test/create/[\w-]*$^', 'test/create/1')):
// do something...
endif;
答案 0 :(得分:3)
使用以下正则表达式(使用$
表示输入的结尾):
'|test/create/[^/]+$|'
如果您只想匹配数字,请使用folloiwng(\d
匹配数字字符):
'^test/create/\d+$^'
答案 1 :(得分:3)
你走了:
"/^test\\/create\\/([^\\/]*)$/"
这说: 以“test”开头,后跟正斜杠的字符串(记住第一个反斜杠转义第二个,因此PHP在输入中放入一个字母反斜杠,它会转义/到正则表达式),然后是create,后跟一个正斜杠,然后是捕获所有不是斜线的东西,然后是字符串的结尾。
评论是否需要更多细节
我更喜欢我的表达总是以/开头,因为它没有作为正则表达式字符的含义,我见过@ used,我相信其他一些答案使用^,这意味着“字符串的开头”所以我不会用它作为我的正则表达式分隔符。
答案 2 :(得分:2)
/ w匹配单词字符,$匹配字符串结尾
if(preg_match('^test/create/\w*$^', 'test/create/1'))
将匹配test / create / [word / num]并且不会跟随。
我认为那就是你所追求的。
编辑在\ w *
中添加*答案 3 :(得分:1)
^是行开头的锚点,即在^之前没有出现字符。使用$来指定字符串的结尾或行的结尾。
编辑:也想添加一个建议:
你的解决方案很好并且有效,但就风格而言,我建议不要使用克拉(^)作为分隔符 - 特别是因为它具有特殊含义,无论是否定或作为线锚的开始因此以这种方式阅读它有点令人困惑。只要在正则表达式中没有出现(或被转义),您就可以合法地使用大多数特殊字符。这里只谈风格/可维护性问题。
当然,几乎每个潜在的分隔符都有一些特殊的含义,但是你也常常在正则表达式的开头看到^,所以我可能会选择另一种选择。例如#在这里是个不错的选择:
if(preg_match('#test/create/[\w-]*$#', $mystring)) {
//etc
}
答案 4 :(得分:0)
正则表达式abc$
只有在最后一个字符串时才匹配abc
。
abcd # no match
dabc # match
abc # match