2014-06-14 48 views
0

我有串状p88t9014-name这里是p是产品和t的子产品ID 和-name是定义的任何名称的用户。 我尝试用preg_match与此代码相匹配的字符串::的preg_match字符串不行

$name="p88t0056-name"; 
if(preg_match('/p[0-9]t[0-9]-[A-Z,a-z]/',$name,$match)) { 
    echo "yes"; 
} else { 
    echo "No"; 
} 
print_r($m); 

我只是尝试,如果是这样的格式与向p[number]t[number]-[anystring]匹配甲。但我的代码不起作用。

+1

名称是否可以包含逗号? –

+0

如果不是,你应该删除逗号。 – idmean

回答

3

你需要把量词你的角色等级后:

'/p[0-9]+t[0-9]+-[A-Za-z]+/' 
+0

添加括号为您的$匹配有部分在里面:/ P([0-9])+ T([0-9])+ - ([A-ZA-Z])+/ – colburton

+0

,并可能'^ '开头,'$'结尾,因为它看起来在试图匹配整个字符串。 – idmean

1

如果你总是有一个数字定数,你也可以使用:

/^p[0-9]{2}t[0-9]{4}-[A-Za-z]+$/ 

下面是一个例子正则表达式:http://www.regexr.com/390ds

0

in regex [0-9]完全匹配一个字符,因此[A-Z,a-z]也是这样,因此$ name不是m atch你给的模式。像“p8t0-A”和“p0t2”这样的字符串通过了测试。

此外,您的模式中的另一个问题是:[A-Z,a-z]不仅匹配字母,还匹配,(单个逗号)。我猜你需要的模式是p[0-9]+t[0-9]+-[A-Za-z]+,其中+表示“至少出现一次”。

2

此正则表达式会为你工作:

/p(\d+)t(\d+)-(\w+)/g

Demo

释:

p匹配字母p

\d+匹配数字0-9

t匹配字母t

\d+匹配数字0-9

-匹配破折号 ' - '

\W+匹配任何字字符并[a-ZA-Z0-9_] 和g至赶上所有比赛。

我也没有对正则表达式,但在http://www.regex101.com尝试多种选择的专家帮助,因为它显示了在右侧面板中的字符解释。希望它有助于未来:)