2011-06-05 36 views
1

我有這樣的代碼:如何確認一個字符串是一個整數的有效base36?

$alias = 'myalias'; 
echo "<pre>"; 
echo " 
ALIAS: $alias 
ROUND: ", intval($alias, 36) , "\n" , 
"AGAIN: ", base_convert(intval($alias, 36), 10, 36) 
; 

echo "<hr>"; 

$alias = '27xk3q'; 
echo "<pre>"; 
echo " 
ALIAS: $alias 
ROUND: ", intval($alias, 36) , "\n" , 
"AGAIN: ", base_convert(intval($alias, 36), 10, 36) 
; 

這用來工作,並且仍然沒有我家的Mac電腦上。輸出是:

ALIAS: myalias 
ROUND: 2147483647 
**AGAIN: zik0zj** 

ALIAS: 27xk3q 
ROUND: 134255366 
AGAIN: 27xk3q 

但是,當我上傳到我的Linux服務器,它回聲不同的東西!

ALIAS: myalias 
ROUND: 49962861028 
**AGAIN: myalias** 

ALIAS: 27xk3q 
ROUND: 134255366 
AGAIN: 27xk3q 

正如你看到的,「myalias」字符串只是打印作爲本身在Linux版本的PHP。

如果這不起作用或是錯誤的代碼,我需要知道一個檢查字符串是否是整數的有效base36版本的萬無一失的方法。

謝謝!

回答

2

如您所見,「myalias」字符串只是在Linux版本的PHP中自行打印。

而且它是正確的行爲。你在你的Mac得到另一個結果 - 因爲它是32位和你的號碼被截斷爲21474836472^32 - 1

if (preg_match('~^[a-z\d]+$~', $string)) { 
    // valid base36 
} 
+0

這看起來像我在湯裏。我繼承了一個數據庫,以前的程序員認爲在表中使用base36版本的序列作爲主鍵是個好主意。他沒有保存相應的整數。 該應用程序的編程方式是該列默認爲自動字符串(相關序列的base36),但用戶可以選擇輸入自定義字符串。 我現在需要區分哪些是自動整數轉換爲base36字符串的等價物,哪些是由用戶輸入的自定義字符串。 任何想法?謝謝! – PKHunter 2011-06-05 16:03:04

+0

@PKHunter:恩,我不認爲這甚至是可能的 – zerkms 2011-06-05 21:58:18

1

你有這樣的問題:你的一臺機器正在與32位有符號整數(第一個),另一個是使用64位有符號整數(或可能更大)在intval轉換。 [參見inval文檔爲範圍。]

myalias從Base36轉換超過0x7FFFFFFF的(最大的帶符號的32位值),而它的確切具有64位符號的int(0xba204c1e4 == 49962861028)。所以你認爲的那個是「破」(linux的一個),實際上是正確版本。第一個因爲溢出而不工作。

0-9a-z字符組成的每個字符串都是有效的Base36編號。唯一可以檢查的是檢查字符串中的所有字符是否在有效範圍內(並檢查溢出(測試返回的值是否是最大int) - 不可靠)。

+0

你的意思是0-9a-z而不是1-9a-z – Anupam 2017-04-05 13:42:07

+0

是@Anupam,感謝您的糾正 – Mat 2017-04-05 13:58:23

相關問題