函数基于正则表达式调用自身

时间:2018-02-16 01:21:06

标签: php regex function

我需要创建一个UID,并给出前几个组件   - 句点之间的部分(。) - 我创建了一个执行此操作的功能。生成此UID的规则是,它不能在组件中具有任何前导零,除非它在其自己的组件中为零。因此: 1.2.6.4.0.123.6653 很好,而 1.2.6.4。 0 123.6653 不是。

我的功能如下:

function genUid($type, $serverId){
    $prefix = '1.2.3.3680043.19.1944';
    $ts = date('YmdHis'); 
    $uniqid = substr(hexdec(uniqid()),-7);

    $uid = $prefix . '.' . $serverId . $type . '.' . $ts . '.' . $uniqid;

    // the uniqid can't start with a leading 0 
    //$re = '/\.0\d]/';
    $re = '/\.0[0-9]/';
    preg_match($re, $uid, $matches);
    if(count($matches)){
        genUid($type, $serverId);
    }
    return $uid;
}

我只是通过

来调用它
for($i=0; $i<100000; $i++){
    $id = genUid('3', '1');
    echo $id . '<br>';
}

echo '<hr>Longest run circa 86,000';

当我运行脚本时,它会显示100,000个UID。要检查我搜索一个句点,然后是零,然后是任何其他数字,1到9.所有看起来都很好,直到我想要检查&#34; .00&#34;在这种情况下,似乎总会产生一个。

正如您所看到的,如果函数发现它创建的UID与正则表达式匹配,则该函数应调用自身&#39; /。0 \ d /&#39; (我试过&#39; /。0 [0-9] /&#39;也看它是否有任何区别,它没有做到但是它似乎总是创造不超过一个失败的UID UID命名规则。

脚本没有超时(大约需要5秒才能完成)所以我有点困惑为什么这个功能没有正确调用自己,或者我的正则表达式不正确?恕我直言,它永远不应该创建违反规则的UID。

任何人都可以给我一些指导,说明原因吗?

1 个答案:

答案 0 :(得分:1)

递归调用函数时,需要if(count($matches)){ return genUid($type, $serverId); } 函数的值:

.

从一般意义上讲,您似乎是从gettimeofday个字符分隔的整数中创建一个id。我可以建议gettimeofdaymt_rand函数吗? mt_rand将为您提供当前时间为两个整数(自纪元以来的秒数,以及秒中的微秒数),function genUid($type, $serverId){ $prefix = '1.2.3.3680043.19.1944'; $time = gettimeofday(); $random = mt_rand(0, 9999999); $uid = sprintf( '%s.%d.%d.%d.%d.%d', $prefix, $serverId, $type, $time['sec'], $time['usec'], $random ); return $uid; } 将生成两个值之间的随机整数。通过使用整数,您不需要检查前导零。这样的事可能适合你:

uniqid

请注意,mt_randgit gc --prune=now 在您的项目中不是加密安全的。