PHP通过FORM在提交的URL中检查HTTP和HTTPS

时间:2018-12-16 05:35:25

标签: php regex

我有这段代码可以检查提交的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。如果这两个网址中的任何一个存在,那么仅表单会被进一步处理。

3 个答案:

答案 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;
    }
}