我有这样的代码:
$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版本。
谢谢!
答案 0 :(得分:2)
如您所见,“myalias”字符串只是在Linux版本的PHP中打印出来。
正确行为。您在Mac上获得了另一个结果 - 因为它是32位且您的号码被截断为2147483647
(2^32 - 1
)
if (preg_match('~^[a-z\d]+$~', $string)) {
// valid base36
}
答案 1 :(得分:1)
您遇到的问题是,您的某台计算机正在使用32位signed int(第一个),另一个正在使用64位有符号整数(或可能更大)进行intval
转换。 [请参阅范围的inval
文档。]
myalias
超过0x7FFFFFFF(最大有符号32位值),而它与64位有符号int(0xba204c1e4 == 49962861028)完全相同。因此,您认为“破坏”(Linux版本)的实际上是正确版本。第一个因为溢出而无法正常工作。
由0-9a-z
个字符组成的每个字符串都是有效的Base36编号。您可以做的唯一检查是检查字符串中的所有字符是否在有效范围内(并检查溢出(测试返回的值是否为最大int) - 不可靠)。