php preg_match, не работает для проверки URL - PullRequest
0 голосов
/ 12 января 2012

У меня есть регулярное выражение PHP preg_match:

#^(http:\/\/|https:\/\/|www\.|//)*(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d{1,5}))?([A-Z0-9_-]|\.|\/|\?|\#|=|&|%)*$#i

Проблема в том, что когда я пытаюсь сопоставить любой URL, заканчивающийся на .com &&, он возвращает true, но, как и ожидалось, должен возвращать false, что может бытьвозможно не так с этим?

Я использую его как:

    function isValidURL($url) {
        if (preg_match("#^(http:\/\/|https:\/\/|www\.|//)*(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d{1,5}))?([A-Z0-9_-]|\.|\/|\?|\#|=|&|%)*$#i", $url)) {
            return true;
        }else{
            return false;
        }
    }

и обращаюсь к нему как:

$URL = $_GET['url'];
echo var_dump(isValidURL($URL));

Теперь, если я открою страницу как /url.php?url=http://www.google.com, она вернет true, еслиЯ открываю страницу как /url.php?url=http://www.google.com**, она возвращает ложь.Если я открываю страницу как /url.php?url=http://www.google.com&&, она возвращает true, но должна возвращать false, поскольку .com && не является действительным TLD.

1 Ответ

3 голосов
/ 12 января 2012

Ваш бит здесь в конце ...

([A-Z0-9_-]|\.|\/|\?|\#|=|&|%)*

- это то, что соответствует амперсандам. Что вы, вероятно, хотите сделать, - это указать префикс вопросительного знака, если есть строка запроса:

(\?([A-Z0-9_-]|\.|\/|\?|\#|=|&|%)*)?

Однако есть лучший способ сделать это в PHP 5.2 +:

var_dump(filter_var('http://example.com', FILTER_VALIDATE_URL));

http://www.php.net/manual/en/filter.filters.validate.php

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