PHP get_meta_tags函数处理无HTTP/HTTPS域名报错问题求助
这个报错的原因很明确:get_meta_tags() 函数需要完整的带协议前缀(HTTP/HTTPS)的URL,如果只传纯域名(比如 www.drhugopavon.com/),它会误把这个路径当成本地文件去读取,自然就会抛出「找不到文件或目录」的警告。
我们可以写一个简单的辅助函数,自动为无前缀的URL添加上协议前缀——优先用更安全的HTTPS,如果HTTPS请求失败,再降级到HTTP。下面是修改后的完整代码:
// 自动为URL添加HTTP/HTTPS前缀的辅助函数 function add_protocol_prefix($url) { // 检查URL是否已经包含http/https前缀(不区分大小写) if (!preg_match('/^https?:\/\//i', $url)) { // 先尝试拼接HTTPS前缀,同时去掉开头多余的斜杠 $https_url = 'https://' . ltrim($url, '/'); // 验证HTTPS是否可正常访问 $headers = @get_headers($https_url); if ($headers && strpos($headers[0], '200') !== false) { return $https_url; } else { // HTTPS不可访问则降级到HTTP return 'http://' . ltrim($url, '/'); } } // 已经有协议前缀,直接返回原URL return $url; } $urls = array( 'https://www.smilesbycarroll.com/', 'https://hurstbournedentalcare.com/', 'https://www.dentalhc.com/', 'https://www.springhurstdentistry.com/', 'https://www.smilesbycarroll.com/', 'www.drhugopavon.com/' ); foreach ($urls as $original_url) { // 先处理URL,确保带协议前缀 $processed_url = add_protocol_prefix($original_url); // 抑制可能的警告,避免页面输出冗余错误信息 $tags = @get_meta_tags($processed_url); if ($tags && isset($tags['viewport'])) { echo "$original_url (处理后:$processed_url) → viewport标签存在<br>"; } else { echo "$original_url (处理后:$processed_url) → viewport标签不存在或URL无法访问<br>"; } }
代码细节说明:
add_protocol_prefix函数:- 用正则表达式快速判断URL是否已有协议前缀,避免重复添加。
- 优先尝试HTTPS是因为现在绝大多数网站都支持HTTPS,安全性更高;如果HTTPS请求失败(比如老网站只支持HTTP),再自动降级。
- 用
ltrim($url, '/')处理URL开头的多余斜杠,避免出现https:////www.xxx.com这种格式错误的URL。
- 主循环优化:
- 保留原始URL用于展示,同时显示处理后的完整URL,方便你对比前后变化。
- 在
get_meta_tags前加@临时抑制警告(也可以用error_reporting()临时调整错误级别,不过@更简洁)。 - 先判断
$tags是否有效,避免URL无法访问时$tags为false导致后续判断报错。
这样修改后,不管传入的URL有没有协议前缀,都能正确调用get_meta_tags函数,不会再抛出找不到文件的错误。
内容的提问来源于stack exchange,提问作者user2217947
相关产品推荐
相关产品推荐

