从字符串中删除重复项

时间:2015-10-18 16:11:35

标签: php regex curl memory proxy

基本上我有一个脚本,它检查代理页面并将其添加到字符串然后检查它是否重复并输出它们。

唯一的问题是被轻松检查的页面上有20k +代理,所以这样做大约需要3-4分钟,大部分时间会给我一个字节耗尽错误或者max_execution错误。

有没有办法检查重复项,只是更快或更容易输出它们?

<?php

ini_set('memory_limit', '-1');

set_time_limit(1000);

//Curl Setup;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'x');
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);        
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

//Execute Curl;
$page = curl_exec($ch);

//Regex For Matching Proxies;
preg_match_all('/(\d){1,3}\.(\d){1,3}\.(\d){1,3}\.(\d){1,3}:(\d){1,5}/ism',$page,$output);

//Foreach Proxy Found, Output it;
foreach($output[0] as $op){ $proxies .= $op."\n"; }

//This doesnt work
implode('\n',array_unique(explode('\n', $proxies)));

//Output each proxy
echo $proxies;

?>

哦,此外,当它确实获得没有错误的代理并使用AJAX将它们放入textarea时会产生严重的滞后问题。你无法点击任何有多少滞后的东西。不确定这整个问题是否与AJAX有关,但不确定。

2 个答案:

答案 0 :(得分:1)

将它们存储在一个数组中,而不是使用array_unique。

$proxies = array ();
for($i =0, $max = count ($output[0]];$i <$max; $i++) {
  $proxies[] = $output [0][$i];
  // unset to reduce memory usage. Unsure if it'll actually help but
  unset($output [0][$i]);
}
echo implode("\n", array_unique  ($proxies));

或者将值用作关联数组的键。不确定这是否会更快

$proxies = array ();
foreach($output[0] as $op){
  $proxies[$op] = null;
}
echo implode("\n", array_keys  ($proxies));

答案 1 :(得分:0)

根据这个(http://php.net/manual/en/function.array-unique.php#70786我没有对它进行测试),你想要的可能方式如下:

//Populate the array maybe different for your needs
$proxies = array();
foreach($output[0] as $op) {
    $proxies[] = $op;
}
$unique_proxies = array_keys(array_flip($proxies)); 

***请求:

如果您可以使用您的数据制作基准并告诉我们结果,那就太好了。