我正在寻找一个匹配的正则表达式:X_X
其中 X 始终是大于零的数字,并且两个数字之间必须有下划线字符。
编辑:当我跑步时
$pattern = "[1-9]_[1-9]";
if (preg_match($pattern, $key))
return TRUE;
我收到警告:
消息:preg_match() [function.preg-match]:未知修饰符“_”
以下内容应该满足您的要求:
preg_match("/[1-9]\d*_[1-9]\d*/", $key)
请注意,这也适用于多于一位数字的数字,如果示例中的
X
只是一位数字,那么您可以删除\d*
。
正则表达式字符串由正则表达式和修饰符(如 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)。
试试这个
$pattern = "/[1-9]_[1-9]/";
您可以使用 [1-9] 定义匹配 1-9 之间所有数字的字符类。
$pattern = "[1-9]_[1-9]";