2014-06-14 49 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嘗試多種選擇的專家幫助,因爲它顯示了在右側面板中的字符解釋。希望它有助於未來:)