Каков наилучший метод проверки URL-адресов на соответствие черному списку в PHP

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

Вопрос

У меня есть скрипт, который удаляет URL-адреса из различных источников, в результате чего получается довольно большой список.В настоящее время у меня только что есть набор операторов if, которые я использую для фильтрации сайтов, которые мне не нужны.Очевидно, что это не поддается сопровождению, поэтому я пытаюсь найти быстрое и мощное решение для фильтрации по черному списку масок URL.

Лучшее, что я мог придумать, - это перебирать массив шаблонов регулярных выражений и фильтровать все, что соответствует.Действительно ли это мой лучший выбор или есть другой метод, который справился бы с этой задачей лучше?

Это было полезно?

Решение

Если вы хотите исключить доменные имена или какой-либо URL-адрес, у которого нет "переменной части", решением может быть использование базы данных с таблицей, содержащей только URL-адрес, с правильным индексом, и быстрое сопоставление.

Выяснение того, не следует ли обрабатывать URL-адрес, было бы тогда всего лишь вопросом или выполнением быстрого запроса к этой базе данных (что обычно означает "URL равен" или "URL начинается с") -- который может быть таким же простым, как база данных SQLite, которая помещается в файл и не требует дополнительного сервера.


Идея PHP-массива имеет один недостаток :когда ваш массив станет больше, ему потребуется все больше и больше памяти только для того, чтобы иметь его в памяти - и, рано или поздно, вы отнимете слишком много памяти и ударите memory_limit ;если у вас более пары тысяч URL-адресов, это решение может оказаться не самым лучшим.

Тем не менее, если у вас есть только пара URL-адресов или шаблонов, идея 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)
    }

Как сказал Паскаль через некоторое время, у вас возникнут проблемы с памятью. Но на этом этапе поддержание URL будет более серьезной проблемой. Перейти на базу данных, когда это произойдет.

Если вам нужно иметь возможность задавать шаблоны, то, вероятно, все в порядке с циклом массива регулярных выражений.

Если вам нужно видеть только точные совпадения и никаких шаблонов, вы можете использовать strpos или что-то подобное, чтобы просто выполнить прямое сопоставление строк, что должно быть несколько быстрее.

Будете ли вы каждый раз загружать в память длинный список предметов? Я думаю, что egrep или grep будет лучшим методом. В Linux ваш файл останется в файловом кеше, и результаты будут очень быстрыми, а поскольку egrep будет проходить через файл, не каждый поток apache будет иметь копию списка в памяти.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top