Найти URL-адреса изображений, которые выдают ошибку «Не найдено» в браузере с заданным форматом неправильного имени, но они на самом деле существуют

#php #regex #cakephp #phpmyadmin

#php #регулярное выражение #cakephp #phpmyadmin

Вопрос:

У меня есть тысячи URL-адресов изображений, хранящихся в таблице, по одному на строку. Дело в том, что некоторые из них имеют плохо отформатированные имена с пробелами, символами с ударением и т.д., Т. Е. Вот так:

 https://www.greatsite.com/upload/memdocs/111046-carte d'identit� 001-072716141540.jpg
  

При открытии этого URL-адреса в браузере выводится следующая ошибка:

 Not Found
The requested URL /upload/memdocs/111046-carte d'identit� 001-072716141540.jpg was not found on this server.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
  

Мне нужно программно найти все URL-адреса изображений, которые выдают эту ошибку «Не найдено» (чтобы позже правильно отформатировать URL-имя изображения).).

Пока я пытаюсь использовать getimagesize() и file_get_contents(), но безуспешно. getimagesize() не всегда работает, потому что я думаю, что это как бы исправляет имя изображения, потому что, например, для URL-адреса выше, он фактически возвращает массив с информацией об изображении. И file_get_contents() всегда возвращает что-то, независимо от того, выдает ли URL-адрес изображения ошибку «Не найдено» или нет.

Есть предложения о том, как я мог бы это сделать? Надеюсь, я имел смысл. Спасибо

Комментарии:

1. существует множество бот-скриптов для проверки ссылок на вашем собственном сайте

Ответ №1:

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

 foreach ($images as $image) {
    $valid = is_file($imageDir.$image->path);
}
  

is_file — оптимальный способ проверить, существует ли файл. file_get_contents прочитает весь файл, что происходит медленно.

Или вы можете просто использовать регулярное выражение в пути к изображению:

 foreach ($images as $image) {
    $valid = preg_match('/[0-9a-zA-Z$-_. !*'(),];/?:@=amp;/', $image->path);
}
  

Я не уверен на 100%, что это регулярное выражение правильно проверит все URL-адреса …. но большинство из них.

Комментарии:

1. Я только что попробовал и, к сожалению, все еще не работает: is_file( /home/greatsite/public_html/upload/memdocs/111046-carte d'identit� 001-072716141540.jpg ) возвращает true , даже если этот URL показывает ошибку «Не найдено» в браузере. Мне нужно знать, показывает ли URL-адрес ошибку «Не найдено» при отображении в браузере. Есть еще мысли? Пожалуйста

2. Можете ли вы добавить URL-адрес изображения сюда?

Ответ №2:

Вы должны получить заголовки, выполняющие веб-запрос:

 foreach ($images as $image) {
 $url = 'https://www.greatsite.com/'.$image;
 $file_headers = @get_headers($url);
 if($file_headers amp;amp; $file_headers[0] == 'HTTP/1.1 404 Not Found') {
  // URL Not Found do something to log it
 }
}
  

Есть много других способов, с использованием CURL и т.д., Но я нахожу это самым простым