我有这段代码:
<?php
$url = "http://asdsfsfsfsfsdfad.com";
$file = file_get_contents($url);
if(preg_match("/<title>(.+)<\/title>/i",$file,$m))
print "$m[1]";
else
print "The page doesn't have a title tag";
?>
当url是一个合适的url时,它工作正常,但是当我放入废话时,我收到两条警告消息:
Warning: file_get_contents() [function.file-get-contents]: php_network_getaddresses: getaddrinfo failed: Navn eller tjeneste ukendt in /var/www/web17/web/administration/custom_pages.php(71) : eval()'d code on line 4
Warning: file_get_contents(http://asdsfsfsfsfsdfad.com) [function.file-get-contents]: failed to open stream: php_network_getaddresses: getaddrinfo failed: Navn eller tjeneste ukendt in /var/www/web17/web/administration/custom_pages.php(71) : eval()'d code on line 4
有什么方法可以阻止这种情况吗?
答案 0 :(得分:1)
implode()
期望第二个参数是一个数组,因此,在进行内爆之前检查$file
是否为数组。
$file = is_array($file) ? implode("",$file) : $file;
甚至更好,使用file_get_contents
,然后您就不需要使用implode
:
$url = "http://asdsfsfsfsfsdfad.com";
$file = file_get_contents($url);
答案 1 :(得分:1)
最简单的解决方案就是抑制错误:
echo @file_get_contents("http://asdsfsfsfsfsdfad.com");
然而,错误抑制通常被认为是不好的做法,因为你永远不知道出了什么问题,所以最好有一个有选择地处理错误的处理程序,例如
set_error_handler(function($code, $message) {
return ($code === E_WARNING && strpos($message, 'php_network_getaddresses'));
});
echo file_get_contents("http://asdsfsfsfsfsdfad.com");
这将使用包含“php_network_getaddresses”的消息来抑制任何E_WARNINGS。任何其他警告都不会被禁止。
此外,您不希望Regex解析HTML,但使用HTML解析器,就像
中给出的那样所以你可以用DOM来做。再次,使用错误抑制(坏)
$dom = new DOMDocument;
@$dom->loadHTMLFile("http://asdsfsfsfsfsdfad.com");
$titles = $dom->getElementsByTagName('title');
echo $titles->length ? $dom->nodeValue : 'No Title found';
或有选择地抑制网络错误:
set_error_handler(function($code, $message) {
return ($code === E_WARNING && strpos($message, 'php_network_getaddresses'));
});
$dom = new DOMDocument;
$dom->loadHTMLFile("http://asdsfsfsfsfsdfad.com");
$titles = $dom->getElementsByTagName('title');
echo $titles->length ? $titles->item(0)->nodeValue : 'No Title found';
然而,这会导致解析错误,因为loadHTMLFile不会返回任何HTML,所以为了抑制解析错误,你必须这样做:
set_error_handler(function($code, $message) {
return ($code === E_WARNING && strpos($message, 'php_network_getaddresses'));
});
libxml_use_internal_errors(true);
$dom = new DOMDocument;
$dom->loadHTMLFile("http://asdsfsfsfsfsdfad.com");
libxml_clear_errors();
$titles = $dom->getElementsByTagName('title');
echo $titles->length ? $titles->item(0)->nodeValue : 'No Title found';
答案 2 :(得分:0)
在加入之前,您应该检查$file
值为false:
$url = "http://asdsfsfsfsfsdfad.com";
$file = file($url);
if ($file !== false) {
$file = implode("",$file);
if(preg_match("/<title>(.+)<\/title>/i",$file,$m)) {
print "$m[1]";
} else {
print "The page doesn't have a title tag";
}
} else {
print "wrong url";
}
答案 3 :(得分:0)
你可以检查$ file是否是数组..
如果你检查它,它永远不会给你一个错误..
if(is_array($file) && count($file)>0){
if(preg_match("/<title>(.+)<\/title>/i",$file,$m))
print "$m[1]";
else
print "The page doesn't have a title tag";
}
else{
echo "$file is not arrya so it does not go in the fi block.";
}
答案 4 :(得分:0)
您无需在文件内容字符串周围添加引号。当您使用函数file_get_contents时,它已经将结果作为字符串返回。通过在它周围添加这些双引号,您基本上不会向字符串添加任何内容。
答案 5 :(得分:-2)
您可以使用curl检查网址是否有效:
<?
function url_exists($strURL) {
$resURL = curl_init();
curl_setopt($resURL, CURLOPT_URL, $strURL);
curl_setopt($resURL, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($resURL, CURLOPT_HEADERFUNCTION, 'curlHeaderCallback');
curl_setopt($resURL, CURLOPT_FAILONERROR, 1);
curl_exec ($resURL);
$intReturnCode = curl_getinfo($resURL, CURLINFO_HTTP_CODE);
curl_close ($resURL);
if ($intReturnCode != 200 && $intReturnCode != 302 && $intReturnCode != 304) {
return false;
}Else{
return true ;
}
}
//Usage Example :
If(url_exists("http://www.weberdev.com/addexample.php3")) {
Echo"URL Exists";
}Else{
Echo"URL doesnot exist";
}
?>
有关详细信息,请参阅http://www.weberdev.com/get_example.php3?ExampleID=4335。