我已经搜索了SO问题,但发现解决方案是基于调用使用
ping
PHP函数执行的system
命令。
我的网络主机服务器不允许我这样做。我该怎么办?
我需要从客户端/网络浏览器端进行检查。
由于无法使用ajax加载外部网页来检查页面是否响应,因此可以执行以下操作:
javascript:
编辑得更加宽容。由于 javascript 在没有任何第三方库的情况下不支持 unicode 字符匹配,这是我选择的方法:
function Validate(url){
var pattern = /(https?:\/\/)?.+\.[a-z]{2,4}/i
return pattern.test(url);
}
alert(Validate("http://abcü好le2.com/?query=test&test=1")); //true
alert(Validate("https://hurmårdu.se/blog/?test=1")); //true
alert(Validate("abcü好le2.com/?query=test&test=1")); //true
alert(Validate("hurmårduse/blog/?test=1")); //false
alert(Validate("hurmårduse")); //false
注意:为了使此功能更好,我们可以添加支持,以便在字符串开头添加 http://(如果不包含该字符串)。另外,如果您对 unicode 正则表达式感兴趣:http://xregexp.com/plugins/
php:
$url = $_POST["url"];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
if(strlen($output)){
return json_encode(array("is_valid" => true, "value" => $url));
}else{
return json_encode(array("is_valid" => false, "value" => $url));
}
注意:代码需要清理 ajax 请求发送的数据。
您的主机允许使用curl 或socket() 函数吗?或者也许使用 fopen 命令进行远程包含?这可能是比使用系统(“ping”)命令更好的选择。
在 php 中进行简单的检查就是
if(strlen(file_get_contents('http://google.com')){ // do something }
客户端可能很棘手,因为大多数浏览器不允许跨端脚本
或者您可以使用 php-curl(如果已安装)。
函数
gethostbyname
和 checkdnsrr
(该函数未在 Windows 上实现)将检查给定主机名是否对应于 DNS 记录(因此本质上是给定主机名是否是公共的)。它应该比file_get_contents
和curl
更快;-)