I';我正在用php编写一个链接检查器,我可以';当站点显示类似';此页面可以';找不到';

I';我正在用php编写一个链接检查器,我可以';当站点显示类似';此页面可以';找不到';,php,regex,http-headers,Php,Regex,Http Headers,我正在制作一个链接检查工具,以避免在我们的网站内容中出现断开的链接,当页面不存在或无法加载时,它会工作——除非外部网站将其替换为一个屏幕,显示类似“此页面似乎不存在”的内容。从我们的菜单中搜索您正在查找的内容…'。 除了此工具的html/css/js代码外,下面是检查链接的主要PHP代码 $headers = get_headers($url); $headers = (is_array($headers)) ? implode( "\n ", $headers) : $he

我正在制作一个链接检查工具,以避免在我们的网站内容中出现断开的链接,当页面不存在或无法加载时,它会工作——除非外部网站将其替换为一个屏幕,显示类似“此页面似乎不存在”的内容。从我们的菜单中搜索您正在查找的内容…'。 除了此工具的html/css/js代码外,下面是检查链接的主要PHP代码

$headers = get_headers($url);
$headers = (is_array($headers)) ? implode( "\n ", $headers) : $headers;
$exists = (bool)preg_match('#^HTTP/.*\s+[(200|301|302)]+\s#i', $headers);
$status = (is_array($headers)) ? $headers[0] : $headers;

然后js使用这些信息,包括$status,但当外部站点显示“未找到”屏幕时,它不会返回错误代码(例如
http://www.drdansiegel.com/resources/healthy_mind_platter
)。

在解析到404之前,您将返回重定向。我会颠倒你的逻辑,检查你是否有
404
400
的密码

$notexists = (bool)preg_match('#^HTTP/.*\s40[04]\s#mi', $headers);
另外,您应该使用
m
修饰符,以便前导锚点匹配每一行,而不是整个字符串

此外,请注意,字符类是一个字符列表,您不能在其中进行分组<代码>[(200 | 301 | 302)]说a
2
0
0
(再次),
3
0
(再次)等都是允许的。你可以写成
(200 | 301 | 302)
如果您想将
200
301
302
作为允许的字符。您可以使用字符类作为重定向状态代码上的最后一个整数(并且应该将
7
8
添加到其中,就好像它们也是有效的重定向一样)。因此它可以是
(200 | 30[1278])

下面是示例链接中包含的
$headers

Array
(
    [0] => HTTP/1.1 301 Moved Permanently
    [1] => Server: nginx
    [2] => Date: Sat, 15 May 2021 01:57:44 GMT
    [3] => Content-Type: text/html
    [4] => Content-Length: 162
    [5] => Connection: close
    [6] => Location: https://www.drdansiegel.com/resources/healthy_mind_platter
    [7] => HTTP/1.1 301 Moved Permanently
    [8] => Server: nginx
    [9] => Date: Sat, 15 May 2021 01:57:45 GMT
    [10] => Content-Type: text/html; charset=UTF-8
    [11] => Content-Length: 0
    [12] => Connection: close
    [13] => Expires: Sat, 15 May 2021 02:57:45 GMT
    [14] => Cache-Control: max-age=3600
    [15] => X-Redirect-By: WordPress
    [16] => Location: https://drdansiegel.com/resources/healthy_mind_platter
    [17] => HTTP/1.1 404 Not Found
    [18] => Server: nginx
    [19] => Date: Sat, 15 May 2021 01:57:46 GMT
    [20] => Content-Type: text/html; charset=UTF-8
    [21] => Connection: close
    [22] => Vary: Accept-Encoding
    [23] => Expires: Wed, 11 Jan 1984 05:00:00 GMT
    [24] => Cache-Control: no-cache, must-revalidate, max-age=0
    [25] => Link: <https://drdansiegel.com/wp-json/>; rel="https://api.w.org/"
)
数组
(
[0]=>HTTP/1.1 301已永久移动
[1] =>服务器:nginx
[2] =>日期:2021年5月15日星期六01:57:44 GMT
[3] =>内容类型:文本/html
[4] =>内容长度:162
[5] =>连接:关闭
[6] =>位置:https://www.drdansiegel.com/resources/healthy_mind_platter
[7] =>HTTP/1.1 301永久移动
[8] =>服务器:nginx
[9] =>日期:2021年5月15日星期六01:57:45 GMT
[10] =>内容类型:文本/html;字符集=UTF-8
[11] =>内容长度:0
[12] =>连接:关闭
[13] =>到期时间:2021年5月15日星期六02:57:45 GMT
[14] =>缓存控制:最大年龄=3600
[15] =>X-Redirect-By:WordPress
[16] =>位置:https://drdansiegel.com/resources/healthy_mind_platter
[17] =>找不到HTTP/1.1 404
[18] =>服务器:nginx
[19] =>日期:2021年5月15日星期六01:57:46 GMT
[20] =>内容类型:文本/html;字符集=UTF-8
[21]=>连接:关闭
[22]=>变化:接受编码
[23]=>过期时间:1984年1月11日星期三格林威治标准时间05:00:00
[24]=>缓存控制:无缓存,必须重新验证,最大使用期限=0
[25]=>链接:;rel=”https://api.w.org/"
)

非常感谢您的帮助。我无法使用$notexists获取HTTP错误代码,但我使用了您的代码数组来循环,它成功了。