以左方括号开头并以右方括号结尾的正则表达式模式会发出警告

问题描述 投票:0回答:4

我正在寻找一个匹配的正则表达式:X_X

其中 X 始终是大于零的数字,并且两个数字之间必须有下划线字符。

编辑:当我跑步时

$pattern = "[1-9]_[1-9]";
if (preg_match($pattern, $key)) 
    return TRUE;

我收到警告:

消息:preg_match() [function.preg-match]:未知修饰符“_”

php regex validation delimiter
4个回答
5
投票

以下内容应该满足您的要求:

preg_match("/[1-9]\d*_[1-9]\d*/", $key)

请注意,这也适用于多于一位数字的数字,如果示例中的

X
只是一位数字,那么您可以删除
\d*


1
投票

正则表达式字符串由正则表达式和修饰符(如 i、m)组成。由于它们都是单个字符串的一部分,因此它们之间有一个强制分隔符 - 单个字符,如管道、斜杠、分号。由于您可以使用任何符号,因此您必须声明将使用哪一个。该选择是用正则表达式字符串的第一个字符声明的。如果是/,那么分隔符就是/。如果是|,那么分隔符就是|。

所以这些是完全等价的(正则表达式'test',修饰符'i'):

preg_match("/test/i");
preg_match("|test|i");
preg_match(":test:i");

如果您之前使用分隔符,PHP 会将下一个字符解释为修饰符。这就是发生在你身上的事情(因为你一开始就使用 [,PHP 解释 ] 作为分隔符,_ 作为修饰符)。

您正在寻找的图案是:

$pattern = '/^\d+_\d+$/';

注意 ^ 和 $ !省略这些(就像大多数其他答案一样)是一个巨大的错误(因为它允许匹配部分之前和之后的任何字符串;如果您忘记了 ^,-20_1 也会匹配,因为它有一个有效的子字符串:20_1)。


0
投票

试试这个

$pattern = "/[1-9]_[1-9]/";

0
投票

您可以使用 [1-9] 定义匹配 1-9 之间所有数字的字符类。

$pattern = "[1-9]_[1-9]";
© www.soinside.com 2019 - 2024. All rights reserved.