2011-09-21 34 views
4

我有這樣的正則表達式:正則表達式使用PHP,包含數字任何非零數字0-9

/^[0-9]+$/i 

在這種使用代碼:

preg_match('/^[0-9]+$/i', $var); 

我想下面的是真實的: $ var = 1; $ var = 50; $ var = 333;

而且以下是錯誤的: $ var = 0; $ var = 01; $ var ='abc';

我想我到目前爲止的作品,除了「0」部分..?

我經歷了這個指南(http://www.phpf1.com/tutorial/php-regular-expression.html),但無法拿出一個完整的答案。

任何幫助將不勝感激,謝謝!

+1

就像PS:你不需要'i'修飾符,如果你沒有使用任何字母;) – NikiC

回答

15
/^[1-9][0-9]*$/ 

含義:一個非零數字後跟任意數字的數字(包括零)。

4

只檢查一個非零位在先,然後任意數量的其它數字

preg_match('/^[1-9][0-9]*$/', $var); 
1

您可以通過強制的第一個數字是不同的,從0與'/^[1-9][0-9]*$/'

與您exemples列表解決這個問題:

foreach (array('1', '50', '333', '0', '01', 'abc') as $var) { 
    echo $var.': '.(preg_match('/^[1-9][0-9]*$/', $var) ? 'true' : 'false')."\n"; 
} 

該腳本得出以下結果:

$ php test.php 
1: true 
50: true 
333: true 
0: false 
01: false 
abc: false 
+0

你不需要括號。在這種情況下他們沒有做任何事情。 –

+0

你是對的,謝謝。我的測試剩餘物。 – Lepidosteus

2

有幾個方法可以做到這一點:

/^[1-9][0-9]*$/ 

/^(?!0)[0-9]+$/ 

無論是其中之一應該是罰款。第一個應該或多或少不言而喻,第二個使用zero-width negative lookahead assertion以確保第一個數字不爲0.

請注意,regex不是爲數字解析而設計的。在數字格式方面,還有其他一些方法可以更快,更靈活。例如:

if (is_numeric($val) && $val != 0) 

...應該拿起任何非零數字,包括小數和科學記數法。

+0

你最後的代碼與正則表達式不匹配(在很多方面):)例如正則表達式不匹配0xABC或0.034e-19或01。 – NikiC

+0

@NikiC - 這是一個公平的觀點,儘管最後一個代碼(自編輯以來)會因爲前導零而阻止這些代碼。然而,正則表達式會阻止1.234,而我發佈的PHP不會。我打算將最後一部分作爲對正則表達式不適用於數字解析的一種承認,所以我編輯時將其更清楚。 –

+0

$ val!= 0檢查零值,不檢查前導零。此外,你通常想要的最後一件事是讓人們用科學記數法,十六進制或十進制輸入一個數字。特別是如果你需要向他們解釋爲什麼他們的「012」得到了「10」而不是「12」。 – NikiC

相關問題