1

我有这样的代码:

$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 版本的万无一失的方法。

谢谢!

4

2 回答 2

2

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

这是正确的行为。你在你的 mac 上得到另一个结果 - 因为它是 32 位的,你的号码被截断为2147483647( 2^32 - 1)

if (preg_match('~^[a-z\d]+$~', $string)) {
    // valid base36
}
于 2011-06-05T08:37:42.880 回答
1

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

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

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

于 2011-06-05T08:44:27.713 回答