由于一些奇怪的原因,下面的函数说这个url“paradox-productions.net”在http://alpha.shurl.be/上无效,在我的localhost上有效。 它是PHP中的错误还是可能导致这种情况的原因? 谁能证实这一点?可以解决或者我需要在服务器上进行PHP升级吗?
phpinfo:http://alpha.shurl.be/phpinfo.php
功能:
<?php
function validUrl($url) {
var_dump($url);
if(strpos($url, ".") !== false) {
var_dump($url);
if(strpos($url, "://") === false) {
$url = "http://" . $url;
var_dump($url);
}
}
if(filter_var($url, FILTER_VALIDATE_URL)) {
echo "VALID\n";
}
else {
echo "INVALID\n";
}
var_dump(filter_var($url, FILTER_VALIDATE_URL));
return filter_var($url, FILTER_VALIDATE_URL);
}
?>
<?php
function validUrl($url) {
var_dump($url);
if(strpos($url, ".") !== false) {
var_dump($url);
if(strpos($url, "://") === false) {
$url = "http://" . $url;
var_dump($url);
}
}
if(filter_var($url, FILTER_VALIDATE_URL)) {
echo "VALID\n";
}
else {
echo "INVALID\n";
}
var_dump(filter_var($url, FILTER_VALIDATE_URL));
return filter_var($url, FILTER_VALIDATE_URL);
}
?>
答案 0 :(得分:3)
这是PHP 5.3.2中的已知错误。它认为带有破折号的URL无效。见https://bugs.php.net/bug.php?id=51258。您的本地PHP必须是不存在此错误的不同版本。
如果您可以升级到工作版本,可能最好这样做。如果不能,可以通过在验证之前删除字符串中其他有效URL字符分隔的所有破折号来解决此问题。下面的正则表达式并不完美,但是如果你知道破折号只会出现在字母,数字或下划线之间(通常是真的,但只是要注意这不会涉及某些不太可能的边缘情况)。< / p>
$url_to_validate = preg_replace("/([\w\d])-(?=[\w\d])/", '\\1\\2', $url);
\w
表示“任何字母或下划线”,\d
表示“任意数字”,因此[\w\d]
表示任何字母,数字或下划线。第二个需要零宽度正向前瞻断言(使用(?=...)
)以确保它捕获像a-b-c-d-e
这样的序列中的所有破折号(没有它,它会错过该序列中的所有其他破折号)。
这是错误报告的主体:
说明
FILTER_VALIDATE_URL不允许主机名中包含短划线/连字符。那太傻了。
测试脚本:
$ php -r 'var_dump(filter_var("http://www.something.com/", FILTER_VALIDATE_URL));' $ php -r 'var_dump(filter_var("http://www.some-thing.com/", FILTER_VALIDATE_URL));'
预期结果:
$ php -r 'var_dump(filter_var("http://www.something.com/", FILTER_VALIDATE_URL));' string(25) "http://www.something.com/" $ php -r 'var_dump(filter_var("http://www.some-thing.com/", FILTER_VALIDATE_URL));' string(26) "http://www.some-thing.com/"
实际结果:
$ php -r 'var_dump(filter_var("http://www.something.com/", FILTER_VALIDATE_URL));' string(25) "http://www.something.com/" $ php -r 'var_dump(filter_var("http://www.some-thing.com/", FILTER_VALIDATE_URL));' bool(false)