我正在寻找可以生成这个的PHP想法/代码/算法:
我有 5 个字符的字符串 [a-zA-Z0-9]
我想用变量过滤器生成排列
滤波器:
- 字符串为"W"
- 字符串是一个数字
- 字符串为"T"
- 字符串为大写
- 字符串为"3"
编辑:
<?php
$reset = fopen('list.txt', 'w');
fclose($reset);
$chars = str_split("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
$file = fopen('list.txt', 'a+');
foreach ($chars as $c0) {
foreach ($chars as $c1) {
foreach ($chars as $c2) {
foreach ($chars as $c3) {
foreach ($chars as $c4) {
$filter = "/[a-z][a-z][a-z][a-z][A-Z]/";
$list = $c0 . $c1 . $c2 . $c3 . $c4;
if (preg_match($filter, $list)) {
$data = $list . "'n";
file_put_contents('list.txt', $data, FILE_APPEND);
}
}
}
}
}
}
fclose($file);
?>
对于 php,你可以下载这个包: http://pear.php.net/package/Math_Combinatorics
与其生成所有可能的排列然后过滤它,不如创建生成器,返回字符串中每个字符的可能值。这将更加有效(仅静态 W 将允许您将输入大小缩小一个非常大的因子)。
您可以通过将函数包装在一个简单的类中来创建生成器(以允许您保持内部状态),为每次迭代返回每个可能的令牌。然后,通过组合对每个生成器的调用并创建可能的返回值来创建排列。
我也强烈建议你不要将file_get_contents和file_put_contents用于这样的事情。使用 fopen
打开文件,然后在每次有新排列时执行fwrite()
。生成所有排列后调用fclose
。