2011-10-18 116 views
1

所以我知道使用php is_numeric函數會更容易,但我想要做的是創建一個正則表達式,主要用於學習正則表達式,測試考試成績。範圍可以是0-100,但可以有2個小數位。這是我到目前爲止,它不工作。正則表達式驗證數字0-100,最多保留兩位小數

if (preg_match("^([0-9]){2,3})(.[0-9]{2})?$([0-9]{1})?$", $quiz1)) 
    { 
     echo "match"; 
    } 
    else { 
     $error = true; 
    } 

如果我想正確的字面意思:

字符串的開始找0-9,爲兩個地。 可選的字符串小數末尾和找到字符0-9,兩個地方。 可選字符串結尾找字符0-9,換1位。

+1

你的正則表達式有語法錯誤和濫用元字符。如果你打算使用正則表達式(我高度推薦你這樣做),你需要花一些時間學習(神祕的)語法。即學習元字符(這是不同的內部和外部字符類BTW),練習,練習,練習與交互式工具,如[RegexBuddy](http://www.regexbuddy.com/)或[RegexPal](http: //regexpal.com/)。有很好的免費教程可以幫助你獲得一個好的開始,例如[http://www.regular-expressions.info/](http://www.regular-expressions.info/)。 – ridgerunner

回答

6

爲什麼不這樣的事情環繞你的表情?

/^(?:100|\d{1,2})(?:\.\d{1,2})?$/ 
  • ^- 串的開頭
  • (:100 | \ d {1,2}) - 非捕獲組,100個或0-99
  • (?:\。d {1,2})? - 任選的非捕獲組
  • $ - 串的端

結果(#或##。):

PHP> $測試=陣列(0,5,10,50 ,100,99.5,75.43,75.436,101);

php> foreach($ tests as $ test){print $ test。 「 - 」。 preg_match(「/ ^(?: 100 | \ d {1,2})(?:\。\ d {1,2})?$ /」,$ test)。 「\ n」 個; }

0 - 1

5 - 1

10 - 1

50 - 1

100 - 1

99.5 - 1

75.43 - 1

75.436 - 0

101 - 0

75F43 - 0

當我添加斜線和刪除多餘的)此致甚至不工作。

php> foreach($ tests as $ test){print $ test。 「 - 」。 preg_match(「/ ^([0-9] {2,3})(。[0-9] {2})?$([0-9] {1})?$ /」,$ test)。「\ n」 個; } 0 - 0

10 - 1

50 - 1

100 - 1

99.5 - 0

75.43 - 1

75.436 - 0

101 - 1

75F43 - 1

+2

你也會匹配'00'和'100.99'。 –

+0

我正在尋找一些接近此事但對我來說100.99是不可接受的。它真的必須在0到100之間。有沒有人有解決這個問題? – Ray

1

gpojd的答案是正確的。然而,這就是爲什麼你的正則表達式不起作用。

首先,你需要在()的第一個$內。因爲否則它需要匹配字符串的末尾,然後在那之後再次結束字符串,這當然是不可能的。

二,點字符需要變成\。因爲一個點本身可以​​匹配任何字符,但你需要一個實際的點。最後,你需要分隔符,就像別人建議的一樣。這裏是你的正則表達式匹配:

第一,兩個或三個數字,強制性的。 然後,任意字符後跟兩位數字,可選。 然後,字符串的結尾是強制性的。 然後,可選擇一位數字。 然後,字符串的結尾再次強制。

既然你是程序員,可能很難習慣用正則表達式思考的方式;你習慣於用if-else語句來思考,但是正則表達式並不是真的那樣工作。

再次,選擇上面是不夠好,但如果我寫這個正則表達式我把:

/^100(.00)?|([1-9]?[0-9])(\.[0-9]{2})?$/ 

所以,無論是100後跟一個可選.00,或:首先,可選的非零數字,然後是一個強制數字(使數字0到99),然後可選一個點,後面跟兩個數字。

+0

但OP說'0'是有效的。此外,這將不匹配'99.5'(這可能是有效的),它將*匹配'100.99'(這幾乎肯定不是*有效)。 –

+0

你是對的,0應該是有效的,它不在我的正則表達式中; 100.99不應該匹配。我會編輯。但是,如果我正確理解OP,那麼它應該沒有點和數字,或者它應該有一個點和兩個數字。 – toon81

+0

我覺得這個問題只是很差的措辭。標題說「最多兩位數」。 (這意味着'0也應該通過,但我不會去那裏:D) –