【发布时间】:2011-06-12 02:41:06
【问题描述】:
有人知道用于 IMEI 验证的 PHP 函数吗?
【问题讨论】:
有人知道用于 IMEI 验证的 PHP 函数吗?
【问题讨论】:
也许可以帮到你:
This IMEI number is something like this: ABCDEF-GH-IJKLMNO-X (without “-” characters)
For example: 350077523237513
In our example ABCDEF-GH-IJKLMNO-X:
AB is Reporting Body Identifier such as 35 = “British Approvals Board of Telecommunications (BABT)”
ABCDEF is Type Approval Code
GH is Final Assembly Code
IJKLMNO is Serial Number
X is Check Digit
这也可以帮助你:http://en.wikipedia.org/wiki/IMEI#Check_digit_computation
如果我没有误解,IMEI 编号使用 Luhn 算法。所以你可以谷歌这个:)或者你可以搜索IMEI算法
【讨论】:
也许你对 cmets 中的 imei 验证器有好处: http://www.php.net/manual/en/function.ctype-digit.php#77718
但我没有测试过
【讨论】:
01 之类的内容,但在我见过的所有情况下都可以忽略。
IMEI 验证使用 Luhn 检查算法。我找到了一个链接,您可以在其中验证您的 IMEI。此外,本页底部是一段用 JavaScript 编写的代码,用于显示如何计算 IMEI 的第 15 位和有效的 IMEI。我可能会给你一些想法。你可以在这里查看http://imei.sms.eu.sk/index.html
【讨论】:
这是一个可能有用的 jQuery 解决方案:https://github.com/madeinstefano/imei-validator
【讨论】:
您可以使用this (witchcraft!) solution,只需检查字符串长度:
function is_luhn($n) {
$str = '';
foreach (str_split(strrev((string) $n)) as $i => $d) {
$str .= $i %2 !== 0 ? $d * 2 : $d;
}
return array_sum(str_split($str)) % 10 === 0;
}
function is_imei($n){
return is_luhn($n) && strlen($n) == 15;
}
这是解释每个步骤的原始函数:
function is_imei($imei){
// Should be 15 digits
if(strlen($imei) != 15 || !ctype_digit($imei))
return false;
// Get digits
$digits = str_split($imei);
// Remove last digit, and store it
$imei_last = array_pop($digits);
// Create log
$log = array();
// Loop through digits
foreach($digits as $key => $n){
// If key is odd, then count is even
if($key & 1){
// Get double digits
$double = str_split($n * 2);
// Sum double digits
$n = array_sum($double);
}
// Append log
$log[] = $n;
}
// Sum log & multiply by 9
$sum = array_sum($log) * 9;
// Compare the last digit with $imei_last
return substr($sum, -1) == $imei_last;
}
【讨论】:
kasperhartwich 玩得很开心
function validateImei($imei, $use_checksum = true) {
if (is_string($imei)) {
if (ereg('^[0-9]{15}$', $imei)) {
if (!$use_checksum) return true;
for ($i = 0, $sum = 0; $i < 14; $i++) {
$tmp = $imei[$i] * (($i%2) + 1 );
$sum += ($tmp%10) + intval($tmp/10);
}
return (((10 - ($sum%10)) %10) == $imei[14]);
}
}
return false;
}
【讨论】:
检查此解决方案
<?php
function validate_imei($imei)
{
if (!preg_match('/^[0-9]{15}$/', $imei)) return false;
$sum = 0;
for ($i = 0; $i < 14; $i++)
{
$num = $imei[$i];
if (($i % 2) != 0)
{
$num = $imei[$i] * 2;
if ($num > 9)
{
$num = (string) $num;
$num = $num[0] + $num[1];
}
}
$sum += $num;
}
if ((($sum + $imei[14]) % 10) != 0) return false;
return true;
}
$imei = '868932036356090';
var_dump(validate_imei($imei));
?>
【讨论】: