2011-03-19 109 views
2

我正在寻找一个正则表达式,将对阵:X_XPHP简单的regex的问题

其中X始终是一个大于零伟大,就必须在这两个数字之间是一个下划线。

谢谢。

编辑:当我运行

$图案= “[1-9] _ [1-9]”; if( preg_match($ pattern,$ key))return TRUE;

我得到警告:

消息:的preg_match() [function.preg匹配]:未知 修改 '_'

+0

而且数字应该小于10吗?换句话说,一个数字号码? – 2011-03-19 21:28:02

+0

没有数字可以高得多,也许5位数字。理想情况下,我不想强​​加限制。 – stef 2011-03-19 21:30:32

+0

在这种情况下,您需要Andrew的解决方案(尽管在分隔符中)。 – 2011-03-19 21:32:33

回答

5

以下应该做你想要什么:

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

注意,这将会对数字工作与一个以上的数字为好,如果X在你的例子仅仅是一个单一的数字号码,然后你可以删除\d*

+0

这给了我与Bernhard解决方案相同的未知修饰符警告。 – stef 2011-03-19 21:29:46

+0

好,与分隔符一起工作。 – stef 2011-03-19 21:34:55

0

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

$pattern = "[1-9]_[1-9]"; 
+0

消息:preg_match()[函数。preg-match]:未知修饰符'_' – stef 2011-03-19 21:27:20

+1

这些模式应该用分隔符括起来:'$ pattern =“/ [1-9] _ [1-9] /”;' – 2011-03-19 21:30:52

+0

对不起,为了与PCRE兼容,模式必须被包含在一些分隔符中$ pattern =“/ [1-9] _ [1-9] /”' – Bernhard 2011-03-19 21:32:24

0

尝试这种

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

甲正则表达式串是由正则表达式和改性剂的(如I,M)。由于它们都是单个字符串的一部分,因此它们之间有强制分隔符 - 单个字符,如管道,斜线,分号。既然你可以使用任何符号,你必须声明你将使用哪一个符号。选择是用你的正则表达式字符串的第一个字符声明的。如果是/,则分隔符将为/。如果是|,则分隔符将是|。

所以这是完全等同的(正则表达式“测试”,修改“I”):

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

,如果您使用的分隔符前面,PHP解释下一个字符作为改性剂。这是发生在你身上的事情(因为你以[,PHP解释]作为分隔符开始并且_作为修饰符)。

你正在寻找的模式是:

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

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