我有这段代码可以检查提交的URL中的http://
。但我希望它也检查https://
。因此,我尝试在or
条件下使用if
,但它仍然只检查http://
而不检查https://
。
这是我的代码。
if(!preg_match("@^http://@i",$turl) or !preg_match("@^https://@i",$turl)){
$msg = "<div class='alert alert-danger'>Invalid Target URL! Please input a standard URL with <span class='text-info'>http://</span> for example <span class='text-info'>http://www.kreatusweb.com</span> </div>";
}
如果我现在将https://
放入URL并提交,它仍然会返回此错误消息,因为现在http://
在这里为假。我应该在这里使用什么逻辑或代码来检查两者。我只是不希望用户提交www.somewebsite.com
。我希望他们使用http://
或https://
提交完整的URL。如果这两个网址中的任何一个存在,那么仅表单会被进一步处理。
答案 0 :(得分:3)
您可以简化正则表达式,使s
是可选的,只需在其后添加?
。
if(!preg_match("@^https?://@i",$turl)){
答案 1 :(得分:1)
将or
替换为&&
if(!preg_match("@^http://@i",$turl) && !preg_match("@^https://@i",$turl))
在我开始编码时,我曾经犯过这个逻辑错误,因为你这样if (not something or not somethingelse)
但是执行if (!http || !https)
会在http和https中都返回true,因为
1-如果它是http,则!https
部分将返回true
2-如果是https,则!http
部分也将返回true
答案 2 :(得分:1)
在http://php.net/manual/en/filter.filters.validate.php处检查PHP验证过滤器。
<?php
$arr = [ 'http:example.com','https:/example.com','https://www.example.com','http://example.com',
'ftp://example.com','www.example.com','www.example.com/test.php','https://www.example.com/test.php?q=6'];
foreach ($arr as $str) {
$filtered = filter_var($str,FILTER_VALIDATE_URL,FILTER_FLAG_SCHEME_REQUIRED|FILTER_FLAG_HOST_REQUIRED);
if (!empty($filtered)) {
if (stripos($filtered,'http') === 0) {
echo $str.' is valid'.PHP_EOL;
} else {
echo $str.' is a valid URL, but not HTTP'.PHP_EOL;
}
} else {
echo $str.' is not a valid URL'.PHP_EOL;
}
}