PHP URL 缩短器错误

标签 php

我有这个 PHP 代码,它应该在每个新条目上增加一个 URL 缩短掩码。 我的问题是,当它到达最后一个字符(z)时,它不会附加新字符。 (我知道递增是一个安全问题,因为您可以猜测较早的条目,但这在本例中不是问题)

如果我添加 00,它可以算出 01 等等...但是有没有一个简单的解决方法来解决为什么它不能自己完成它?

(参数为最后一项)

<?php

class shortener
{

    public function ShortURL($str = null)
    {
        if (!is_null($str))
        {
            for($i = (strlen($str) - 1);$i >= 0;$i--)
            {
                if($str[$i] != 'Z')
                {
                    $str[$i] = $this->_increase($str[$i]);
                    #var_dump($str[$i]);
                    break;
                }
                else
                {
                    $str[$i] = '0';
                    if($i == 0)
                    {
                        $str = '0'.$str;
                    }
                }
            }
            return $str;
        }
        else {
            return '0';
        }
    }

    private function _increase($letter)
    {
        //Lowercase: 97 - 122
        //Uppercase: 65 - 90
        //  0 - 9  : 48 - 57
        $ord = ord($letter);
        if($ord == 122)
        {
            $ord = 65;
        }
        elseif ($ord == 57)
        {
            $ord = 97;
        }
        else
        {
            $ord++;
        }
        return chr($ord);
    }
}

?>

最佳答案

实际上,您所做的就是将数字编码为 Base62。因此,如果我们获取该字符串,将其解码为基数 10,递增它,然后将其重新编码为 Base62,那么就更容易知道我们在做什么,并且字符串的长度会自行解决。

class shortener
{
  public function ShortURL($str = null)
  {
    if ($str==null) return 0;
    $int_val = $this->toBase10($str);
    $int_val++;
    return $this->toBase62($int_val);
  }

  public function toBase62($num, $b=62) {
    $base='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $r = $num  % $b ;
    $res = $base[$r];
    $q = floor($num/$b);
    while ($q) {
      $r = $q % $b;
      $q =floor($q/$b);
      $res = $base[$r].$res;
    }
    return $res;
  }

  function toBase10( $num, $b=62) {
    $base='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $limit = strlen($num);
    $res=strpos($base,$num[0]);
    for($i=1;$i<$limit;$i++) {
      $res = $b * $res + strpos($base,$num[$i]);
    }
    return $res;
  }
}

关于PHP URL 缩短器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20223626/

相关文章:

PHP - 表单验证函数。如何使用函数来编写更好的代码?

php - Symfony/serializer 在对象中标准化对象

php - 使用日期时间获取结果

html - 如何在我的 PHP 文件中引用我的 MySQL 数据库之一?

php - 查找数组中的条目并将其放在第一位或与第一个数组条目交换

php - 内容管理系统 : How to handle internal URLs best?

php - 如何使用 PHP 将单个数组项推送到另一个数组中?

php - 使用 Sencha Touch 2 Ajax 请求从 PHP 代码获取字符串结果

php - 从坐标获取位置?

javascript - AJAX 不会将变量传输到 PHP