自动递增唯一网址

时间:2010-08-06 14:16:13

标签: php regex string

我希望使用PHP创建一个自动递增的唯一字符串,包含[a-Z 0-9],从2个字符开始,并在需要时增长。

这是针对网址缩小器,因此每个字符串(或别名)都将保存在附加到网址的数据库中。

非常感谢任何见解!

4 个答案:

答案 0 :(得分:2)

请注意,此解决方案不会生成大写字母。

使用base_convert()转换为基数36,它将使用[a-z0-9]。

<?php
// outputs a, b, c, ..., 2o, 2p, 2q
for ($i = 10; $i < 99; ++$i)
  echo base_convert($i, 10, 36), "\n";

给定上次使用的数字,您可以将其转换回intval()递增的整数,并使用base_convert()将结果转换回基数36。

<?php

$value = 'bc9z';
$value = intval($value, 36);
++$value;
$value = base_convert($value, 10, 36);
echo $value; // bca0

// or
echo $value = base_convert(intval($value, 36) + 1, 10, 36);

答案 1 :(得分:0)

如果你的字符串是单个案例而不是混合字符串,并且不包含数字,那么你可以逐字地增加它:

$testString="AA";
for($x = 0; $x < 65536; $x++) {
    echo $testString++.'<br />';
}

$testString="aa";
for($x = 0; $x < 65536; $x++) {
    echo $testString++.'<br />';
}

但即使使用混合的字母数字字符串

,您也可以使用此功能

答案 2 :(得分:0)

为了扩展meagar的答案,以下是如何使用大写字母和数字任意大(需要bcmath extension,但你可以使用gmp或bigintegers pear包):< / p>

function base10ToBase62($number) {
    static $chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $result = "";
    $n = $number;
    do {
        $remainder = bcmod($n, 62);
        $n = bcdiv($n, 62);
        $result = $chars[$remainder] . $result;
    } while ($n > 0);

    return $result;
}

for ($i = 10; $i < 99; ++$i) {
    echo base10ToBase62((string) $i), "\n";
}

答案 3 :(得分:0)

这是incr函数的一个实现,它接受包含字符[0-9a-zA-Z]的字符串并递增它,如果需要使用'carry-the-one'将0推到前面方法

<?php

function incr($num) {
  $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  $parts = str_split((string)$num);

  $carry = 1;
  for ($i = count($parts) - 1; $i >= 0 && $carry; --$i) {
    $value = strpos($chars, $parts[$i]) + 1;
    if ($value >= strlen($chars)) {
      $value = 0;
      $carry = 1;
    } else {
      $carry = 0;
    }
    $parts[$i] = $chars[$value];
  }

  if ($carry)
    array_unshift($parts, $chars[0]);

  return implode($parts);
}

$num = '0';
for ($i = 0; $i < 1000; ++$i) {
  echo $num = incr($num), "\n";
}