我有一个刮削从各种源的URL,从而导致相当大的列表中的脚本。目前,我刚刚拿到了,如果我使用过滤掉的网站,我不想语句的集合。这显然是不维护的,所以我试图找到对URL口罩的黑名单过滤一个快速和强大的解决方案。

我可以想出通过正则表达式模式的阵列循环和过滤匹配任何的最好的事情。这真的是我最好的选择还是有会更好的工作性能的另一种方法?

有帮助吗?

解决方案

如果您想排除的域名,或者说没有“可变部分”一些URL,一个解决方案可能是使用一个数据库,以仅包含URL的表,用右手食指,做一个快速的匹配。

找出如果一个URL不能将那么只能是一个问题或做一个快速的查询到DB的(这通常意味着“URL等于”,或者“URL开头”)进行处理的 - 其可以是作为一个SQLite DB,其适合在一个文件和不需要其它附加服务器作为简单

,点击 PHP数组的想法有一个缺点:当你的阵列将得到更大,它会需要越来越多的内存只是有它在内存中 - 和,有一天或者其他,你会花太多的内存和会打memory_limit;如果你有超过两几千个网址,这种解决方案可能不是最好的之一。

不过,如果只有几个网址或图案,PHP数组的想法,遍历它,并比较strpos每个值的(对于“包含”或“开头”)preg_match (对于正则表达式)会做得很好 - 和是最容易实施的一个

,点击 如果你想使用一些复杂的匹配规则,使用某种正则表达式的可能会是你的唯一途径......无论是在PHP端,与preg_match,或SQL服务器(MySQL的,例如,对正则表达式的支持,据我所知 - 没有关于表演的想法,但是,看到的 11.4.2。正则表达式为更详细的信息)

其他提示

您应该保持在一个哈希的网站,并期待这样的。它是简单和优雅:

    $excluded['www.google.com'] = true;
    $excluded['www.mapquest.com'] = true;
    $excluded['www.yahoo.com'] = true;

    $url = "http://www.google.com?q=barefoot+winery";

    $urlArray = parse_url($url)

    if (! isset($excluded[$urlArray['host']]))
    {
        scrape($url)
    }

帕斯卡一会儿后说你会遇到内存问题。但是,在这一点上保持网址会是一个更大的问题。去一个数据库当发生这种情况。

如果您需要能够以指定的图案,然后通过正则表达式的阵列循环可能是细

如果你只需要看到确切的比赛和没有图案,可以用strpos或这样只是做直字符串匹配,这应该是稍快。

你会被加载每次物品存储的一个长长的清单?我想的egrep或grep的将是最好的方法。在Linux文件将保留在文件缓存和结果会非常快,因为egrep的将通过文件来运行,并不是每一个Apache的线程将有名单的副本存储在存储器。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top