Проверьте URL с помощью регулярных выражений и filter_val - PullRequest
0 голосов
/ 03 июня 2011

Я искал лучший способ проверить URL в php и решил использовать и regex, и filter_val() Я хотел бы поделиться своим кодом и получить отзыв, пожалуйста.

function _valid_urls($str) {

        $regex = "/^(http):\/\/([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i";

        if(!filter_var($str, FILTER_VALIDATE_URL) || (!preg_match($regex, $str))) //if invalid URL
        {               
            return FALSE;
        }
        else 
        {
            return TRUE;
        }
    } 

Код работает, но я не совсем уверен, безопасен ли он.

EDIT:

Я нашел наиболее эффективное регулярное выражение для URL-адресов веб-сайтов: /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \?=.-]*)*\/?$/

http://www.catswhocode.com/blog/10-regular-expressions-for-efficient-web-development

1 Ответ

3 голосов
/ 03 июня 2011

Вы сделали несколько ошибок в регулярном выражении. Ничего фатального, я не думаю, но тем не менее, всего лишь несколько разных вещей, которые вы можете сделать, чтобы очистить его. Вы поставили круглые скобки вокруг http, и они не должны быть там. Похоже, вы не захватываете его для использования позже. Если вы пытаетесь сделать http: // part необязательным, вы захотите использовать (?: Http: \ / \ /)? вместо. Также обратите внимание, что вам нужно избегать обратной косой черты в строке. Будет ли это работать так же хорошо?

$regex = "/^".
  "(?:http:\\/\\/)?".  // Look for http://, but make it optional.
  "(?:[A-Z0-9][A-Z0-9_-]*(?:\\.[A-Z0-9][A-Z0-9_-]*))". // Server name
  "(?:\\d+)?".         // Optional port number
  "(?:\\/\\.*)?/i";    // Optional training forward slash and page info

Вероятно, есть более подходящие регулярные выражения для соответствующих URL-адресов. Я бы предложил Googling regex url и взглянул на них. Не изобретайте велосипед, если не нужно! Также обратите внимание, что вышеупомянутое не допускает URL-адреса без доменов верхнего уровня, например http://localhost/mypage.html.. Если поставить знак вопроса перед двойными кавычками в строке «Имя сервера», это должно разрешать использование нерекламных URL-адресов. .

Это немного неэффективно:

if(!filter_var($str, FILTER_VALIDATE_URL) || (!preg_match($regex, $str))) //if invalid URL
{               
    return FALSE;
}
else 
{
    return TRUE;
}

Ваше выражение даст значение true / false. Как насчет того, чтобы просто вернуть это, отрицать при необходимости?

return !(!filter_var($str, FILTER_VALIDATE_URL) || !preg_match($regex, $str));

Также обратите внимание, что эти выражения эквивалентны:

!(!A || !B)
   A &&  B

Так что это можно упростить до:

return filter_var($str, FILTER_VALIDATE_URL) && preg_match($regex, $str);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...