2014-02-06 268 views
2

我試圖檢查用戶名字符串是否都是數字(但該字段不是數字字段)。如果是這樣,我需要通過添加前導0來使字符串長度爲5個字符。PHP檢查字符串是否包含數字和檢查字符串長度

我有這樣的代碼:

<?php 
$getuname = $_GET['un']; 

if (mb_strlen($getuname) <= 1){ 
     $getuname = "0".$getuname; 
    } 
if (mb_strlen($getuname) <= 2){ 
     $getuname = "0".$getuname; 
    } 
if (mb_strlen($getuname) <= 3){ 
     $getuname = "0".$getuname; 
    } 
if (mb_strlen($getuname) <= 4){ 
     $getuname = "0".$getuname; 
    } 
echo $getuname; 
?> 

上面的代碼適用於確保該字符串是5個字符加零,但它是不是很漂亮,我敢肯定有一個更漂亮的方式做它。任何人?

此外,整個片段需要包裝在一個IF語句中,該語句將檢查它是否包含首字母而不包含數字。我嘗試使用!is_numeric,但這似乎不起作用。我假設,因爲它不是一個數字類型的字段。

+1

使用'preg_match'來檢查用戶名是否只包含數字http://es1.php.net/preg_match – Reger

+0

tas9是完全正確的,preg_match是檢查的最佳解決方案。在這種情況下is_int和is_numeric不可靠。 – Flixer

+0

供參考:對於100萬次以上的代表進行速度測試,'ctype_digit'花了0.114777s,正則表達式解決方案花了0.783449s –

回答

4

可以使用is_numeric檢查數字字段,不要緊的變量是否是字符串與否。你可以簡單地墊使用See example here.

然後str_pad()

if(!is_numeric($test)) 
    echo $test . ' is not a number!'; 
else 
    echo str_pad($test, 5, 0, STR_PAD_LEFT); 

編輯:爲flixer指出,is_numeric()實際上並不會做什麼你特別要求(檢查字符串只包含數字,即無句點,逗號,破折號等將被視爲「是一個數字」)。在這種情況下,使用ctype_digit()代替:

$test_number = '123.4'; 
$test_number2 = '12345'; 

echo ctype_digit($test_number) ? $test_number . ' is only digits' : $test_number . ' is not only digits'; 
echo ctype_digit($test_number2) ? $test_number2 . ' is only digits' : $test_number2 . ' is not only digits'; 

// output: 
// 123.4 is not only digits 
// 12345 is only digits 

這裏的關鍵是要avoid regex when you have better tools to do the job.

要一點點添加到這一點,當你在一個整型變量傳遞ctype_digit()可能會返回:(從PHP示例手動)

ctype_digit('42'); // true 
ctype_digit(42); // false - ASCII 42 is the * symbol 

這可能是好的,這取決於你在使用這個情況。你的情況,你在驗證$_GET變量,它是總是成爲一個字符串,所以它不會影響你。

文檔:

OP在這裏,這是他們放在一起。奇蹟般有效...

if (ctype_digit($getuname) == true) { 
    $getuname = str_pad($getuname, 5, 0, STR_PAD_LEFT); 
    } 
+2

「is_numeric」的首選解決方案不是檢查字符串是否僅包含數字的好方法,因爲它將在'5.1 ','-3'和'1e7' – Flixer

+0

@Flixer不錯的地方,更新的答案 –

2

使用str_pad()函數。就像這樣:

$getuname = str_pad($_GET['un'], 5, '0', STR_PAD_LEFT); 
-1
<?php 
$getuname = $_GET['un']; 


while (strlen($getuname) < 5) { 
    $getuname = '0' . $getuname; 
} 

echo $getuname; 

?> 
1

這應該是一個乾淨的解決方案:

$getuname = $_GET['un']; 
if(preg_match('/^\d+$/',$getuname)){ 
    echo sprintf('%05d', $getuname); 
}else{ 
    // incorrect format 
} 
+3

這裏不需要使用正則表達式。 –

+1

爲什麼不呢?檢查「我試圖檢查用戶名字符串是否全是數字」 – Flixer

2

試試這個:

<?php 
$getuname = $_GET['un']; 
if(ctype_digit($getuname)) 
    $getuname = str_repeat("0", 5-strlen($getuname)) . $getuname; 
?> 

希望工程妳。

相關問題