#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 и т.д., Но я нахожу это самым простым