Проверка PHP для HTTP и HTTPS в представленном URL через FORM - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть этот код, который проверяет наличие http:// в представленном URL.Но я хочу, чтобы он также проверил на 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.Я хочу, чтобы они отправили полный URL-адрес, используя http:// или https://.Если какой-либо из этих двух элементов присутствует в URL-адресе, дальнейшая обработка будет выполняться только в форме.

Ответы [ 3 ]

0 голосов
/ 16 декабря 2018

Вы можете упростить регулярное выражение, чтобы s было необязательным, просто добавив ? после него.

if(!preg_match("@^https?://@i",$turl)){
0 голосов
/ 16 декабря 2018

Проверьте фильтры проверки PHP на http://php.net/manual/en/filter.filters.validate.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;
    }
}
0 голосов
/ 16 декабря 2018

замените or на &&

if(!preg_match("@^http://@i",$turl) && !preg_match("@^https://@i",$turl))

Я делал эту логическую ошибку, когда начинал кодировать, потому что вы думаете, как это if (not something or not somethingelse)

, но делаете if (!http || !https) вернет true как в http, так и в https, потому что

1- если это http, то часть !https вернет true

2-, если это https, тогда !http part тоже вернет true

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...