正则表达式 - 只要没有任何内容匹配词

时间:2013-08-27 15:27:48

标签: php regex

正则表达式有点麻烦。我正在尝试测试一场比赛,但前提是没有任何内容。所以在下面的例子中,如果我去测试/创建/ 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;

5 个答案:

答案 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