2013-10-15 27 views
0

我想要一個只接受字母和一個連字符的正則表達式。該值必須以5(5和1連字符)開始,之後只有5-15個數字。PHP:preg_match - >數字和一個連字符

我目前使用:preg_match('/^[5]-{1}[\0-9]{5,15}$/', $_POST['value'])

有效值爲:5-123456789

我正則表達式接受兩個連字符像5--123456789。它必須以5,一個連字符和5-15個數字開頭。我應該怎麼做?

在此先感謝!

回答

4

問題是你指定了錯誤的數字:[\0-9]匹配索引在零和9之間的任何字符 - 以ASCII字符表示索引爲0到57的字符。連字符的索引爲45,所以它是允許。發生這種情況是因爲\0被解釋爲octal escape序列。

您應該使用[0-9]{5,15}\d{5,15}來代替。你也可以在一定程度上簡化正則表達式; /^5-\d{5,15}$/正確且較短。

+1

爲什麼'[0-9]'錯了嗎? – Treps

+1

@Treps:'[0-9]'沒有錯,但'[\ 0-9]'(額外的反斜槓)是。 – Jon

+0

Ahaaaa!它的工作順便說一句。好,我可以使用'[0-9]'和'\ d'。 :)你是否也知道如何構建一個正則表達式,其中包含字母和數字以及{5,15}'。它應該接受大寫或小寫字母,但它必須包含字母,數字和「{5,15}」。 – Treps

1

您在0之前使用\,表示它不是範圍0-9,而是0和-9,所以這是您的第二個連字符(但是它是可選的,因爲在括號[]中)。從括號中刪除這個\。離開這樣的:

preg_match('/^[5]-{1}[0-9]{5,15}$/', $_POST['value']) 

即使這個符號是正確的:

preg_match('/^5-[0-9]{5,15}$/', $_POST['value']) 
+0

「0和-9」?這是什麼意思? – Jon

+1

在這種情況下,它有點竅門。正如Jon在他的編輯中所描述的那樣,實際上'\ 0'映射到ASCII值零。所以'-'仍然被解釋爲一個範圍。 –

相關問題