-1

我有一个充满代理服务器的文本文件。有些在开头带有 # 注释,不应使用。我尝试使用下面的代码来执行此操作,但它仍在选择注释行。我哪里错了?

function getProxy()
{
    $file = file('proxy.txt',FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

    $line = $file[array_rand($file)];

    if (strpos($line,'#') !== FALSE) { getProxy(); }

    return $line;
}

理想情况下,我认为代码可能应该执行某种形式的 while 循环,直到它(随机)选择一个开头没有 # 的代理 - 而不是每次都调用该函数并重新加载文件。

帮助!

4

2 回答 2

0

实际上,处理问题的最佳方法是删除任何被注释的行,然后才选择随机结果。

否则,您可能会遇到非常糟糕的连续性或包含数千条注释行且一两行处于活动状态的文件,并且将等待数小时以随机选择有效的一行。

function getProxy()
{
    $file = file('proxy.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

    foreach ($file as $key => $line) {
        if (strpos(ltrim($line), "#") === 0) {
            unset($file[$key]);
        }
    }

    $line = $file[array_rand($file)];

    return $line;
}

您可以array_filter()改为使用,如下所示:

$file = array_filter($file, function($value){return !(strpos(ltrim($value), "#") === 0);});
于 2013-07-28T12:46:17.030 回答
-1

true - 循环在这里更好:

function getProxy()
{
    $file = file('proxy.txt',FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

    do {

       $line = $file[array_rand($file)];

    } while(strpos($line,'#') !== FALSE);

    return $line;
}

您还必须添加一些额外的条件 - 如果文件只有注释行,它现在将创建无限循环,所以更好的主意是:

function getProxy()
{
    $maxChecks=100;
    $i=0;
    $file = file('proxy.txt',FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

    do {
       $line = $file[array_rand($file)];
       if($i++>$maxChecks) break;
    } while(strpos($line,'#') !== FALSE);

    if($i>$maxChecks)
       return false;

    return $line;
}
于 2013-07-28T10:34:31.107 回答