Quelle est la meilleure méthode pour tester les URL par rapport à une liste noire en PHP

StackOverflow https://stackoverflow.com/questions/1446838

Question

J'ai un script qui extrait des URL de différentes sources, ce qui donne une liste assez longue. Actuellement, je viens de recevoir une collection de déclarations if que j'utilise pour filtrer les sites que je ne souhaite pas. Cela n’est évidemment pas gérable, alors j’essaie de trouver une solution rapide et puissante pour filtrer les listes de masques d’URL.

La meilleure chose que je puisse faire est de parcourir en boucle un tableau de motifs de regex et de filtrer tout ce qui correspond. Est-ce vraiment mon meilleur choix ou existe-t-il une autre méthode qui ferait mieux le travail?

Était-ce utile?

La solution

Si vous souhaitez exclure des noms de domaine ou des URL sans "partie variable", vous pouvez utiliser une base de données, avec une table contenant uniquement l'URL, avec le bon index, et effectuer une correspondance rapide. .

Déterminer si une URL ne doit pas être traitée ne constituerait alors qu'un problème ou une simple requête sur cette base de données (ce qui signifie généralement "URL égal à" ou "l'URL commence par") - qui peut être aussi simple qu'une base de données SQLite, qui tient dans un fichier et ne nécessite pas de serveur supplémentaire.


L'idée d'un tableau PHP présente un inconvénient: lorsque votre tableau s'agrandit, il faudra de plus en plus de mémoire rien que pour le garder en mémoire - et, un jour ou l'autre, vous en prendrez trop et limite_mémoire ; si vous avez plus de quelques milliers d'URL, cette solution pourrait ne pas être la meilleure.

Néanmoins, si vous ne disposez que de quelques URL ou modèles, l’idée d’un tableau PHP, qui passe au-dessus de celui-ci et compare chaque valeur à strpos (for "contient" ou "commence par") ou preg_match (pour regex) fera l'affaire - et est le plus simple à implémenter.


Si vous voulez utiliser une règle de correspondance complexe, utiliser une sorte de regex sera probablement votre seul moyen réel ... Que ce soit du côté de PHP, avec preg_match , ou sur un serveur SQL (MySQL, par exemple, supporte regex, autant que je sache - aucune idée des performances, cependant; voir 11.4.2. Expressions régulières pour plus d'informations)

Autres conseils

Vous devez conserver les sites dans un hachage et regarder comme ça. c'est simple et élégant:

    $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)
    }

Comme pascal l’a dit après un moment, vous aurez des problèmes de mémoire. Mais à ce stade, le maintien des URL sera un problème plus important. Choisissez une base de données lorsque cela se produit.

Si vous devez être en mesure de spécifier des modèles, alors le bouclage dans un tableau de expressions rationnelles convient probablement.

Si vous n'avez besoin que de voir les correspondances exactes et aucun motif, vous pouvez utiliser strpos ou autre pour faire une correspondance avec une chaîne droite, ce qui devrait être un peu plus rapide.

Allez-vous charger une longue liste d’articles à chaque fois? Je pense qu'egrep ou grep sera la meilleure méthode. Sous Linux, votre fichier restera dans le cache de fichier et les résultats seront très rapides. Etant donné que egrep fonctionnera dans un fichier, tous les threads Apache n’auront pas la copie de la liste en mémoire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top