Как пропустить ссылки, содержащие расширения файлов, при просмотре веб-страниц с использованием PHP - PullRequest
0 голосов
/ 01 января 2012

Вот функция, которая проверяет домен .edu и проверяет, что URL не указывает на документ .pdf или .doc.

public function validateEduDomain($url) {
    if( preg_match('/^https?:\/\/[A-Za-z]+[A-Za-z0-9\.-]+\.edu/i', $url) && !preg_match('/\.(pdf)|(doc)$/i', $url) )  {
        return TRUE;
    }
    return FALSE;

Теперь я сталкиваюсь со ссылками, которые указывают на jpg, rtf и другие, которые simple_html_dom пытается проанализировать и вернуть его содержимое. Я хочу избежать этого, пропустив все такие ссылки. Проблема в том, что список не является исчерпывающим, и я хочу, чтобы код пропускал все такие ссылки. Как я должен это сделать ??

Ответы [ 2 ]

4 голосов
/ 01 января 2012

Попытка отфильтровать URL-адреса, угадав, что стоит за ним, всегда будет терпеть неудачу в ряде случаев.Предполагая, что вы используете curl для загрузки, вы должны проверить, является ли заголовок типа документа ответа среди допустимых:

<?php

require "simple_html_dom.php";

$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); //default is to output it

$urls = array(
  "google.com", 
  "https://www.google.com/logos/2012/newyearsday-2012-hp.jpg", 
  "http://cran.r-project.org/doc/manuals/R-intro.pdf",
);
$acceptable_types = array("text/html", "application/xhtml+xml");

foreach ($urls as $url) {
  curl_setopt($curl, CURLOPT_URL, $url);
  $contents = curl_exec($curl);

  //we need to handle content-types like "text/html; charset=utf-8"
  list($response_type) = explode(";", curl_getinfo($curl, CURLINFO_CONTENT_TYPE));

  if (in_array($response_type, $acceptable_types)) {
    echo "accepting {$url}\n";
    // create a simple_html_dom object from string
    $obj = str_get_html($contents);
  } else {
    echo "rejecting {$url} ({$response_type})\n";
  }
}

, выполнение приведенных выше результатов приводит к:

accepting google.com
rejecting https://www.google.com/logos/2012/newyearsday-2012-hp.jpg (image/jpeg)
rejecting http://cran.r-project.org/doc/manuals/R-intro.pdf (application/pdf)
0 голосов
/ 01 января 2012

Обновите последнее регулярное выражение до следующего вида:

!preg_match('/\.(pdf)|(doc)|(jpg)|(rtf)$/i', $url) )

Отфильтрует документы jpgs и rtf.

Вы должны добавить расширения к регулярному выражению выше, чтобы пропустить их.

Обновление

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

preg_match('/\.(html)|(html)|(php)|(aspx)$/i', $url) )
...