找到在浏览器中出现“Not Found”错误的图像URL,但是它们实际存在

时间:2016-10-19 20:22:35

标签: php regex cakephp phpmyadmin

我有数千个图像网址存储在一个表格中,每行一个。问题是他们中的一些具有空格,重音字符等格式错误的名称,例如:

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.

我需要以编程方式查找抛出此“未找到”错误的所有图片网址(以便稍后正确格式化图片网址名称)。

到目前为止,我正在尝试使用getimagesize()和file_get_contents(),但没有运气。 getimagesize()并不总是有效,因为我觉得它有点修复图像名称,因为例如对于上面的url,它实际上会返回带有图像信息的数组。并且file_get_contents()总是返回一些东西,无论图像url是否抛出“Not Found”错误。

有关如何实现这一目标的任何建议?我希望我有道理。感谢

2 个答案:

答案 0 :(得分:1)

您可以从DB获取所有图像并使用foreach迭代它们。在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\$-_\.\+!\*'\(\),];\/\?\:\@=\&/', $image->path);
}

我不是100%确定这个正则表达式是否会正确验证所有网址....但大多数都是。

答案 1 :(得分:0)

您应该获得执行网络请求的标头:

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

还有许多其他方法,使用CURL等,但我发现这是最简单的