如何确认字符串是整数的有效base36?

时间:2011-06-05 08:33:26

标签: php 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 个答案:

答案 0 :(得分:2)

  

如您所见,“myalias”字符串只是在Linux版本的PHP中打印出来。

正确行为。您在Mac上获得了另一个结果 - 因为它是32位且您的号码被截断为21474836472^32 - 1

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

答案 1 :(得分:1)

您遇到的问题是,您的某台计算机正在使用32位signed int(第一个),另一个正在使用64位有符号整数(或可能更大)进行intval转换。 [请参阅范围的inval文档。]

从Base36转换的

myalias超过0x7FFFFFFF(最大有符号32位值),而它与64位有符号int(0xba204c1e4 == 49962861028)完全相同。因此,您认为“破坏”(Linux版本)的实际上是正确版本。第一个因为溢出而无法正常工作。

0-9a-z个字符组成的每个字符串都是有效的Base36编号。您可以做的唯一检查是检查字符串中的所有字符是否在有效范围内(并检查溢出(测试返回的值是否为最大int) - 不可靠)。