Проверьте, является ли строка URL-адресом

Я видел много вопросов, но не мог понять, как это работает так как я хочу более простой случай.

Если у нас есть текст, что бы это ни было, я бы хотел проверить, является ли он URL-адресом или нет.

$text = "something.com"; //this is a url

if (!IsUrl($text)){
    echo "No it is not url";
    exit; // die well
}else{
    echo "Yes it is url";
    // my else codes goes
}

function IsUrl($url){
    // ???
}

Есть ли другой способ, а не проверка с помощью JavaScript в случае блокировки JS?

Ответ 1

http://www.php.net/manual/en/function.preg-match.php#93824

<?php 
    $regex = "((https?|ftp)\:\/\/)?"; // SCHEME 
    $regex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)[email protected])?"; // User and Pass 
    $regex .= "([a-z0-9-.]*)\.([a-z]{2,3})"; // Host or IP 
    $regex .= "(\:[0-9]{2,5})?"; // Port 
    $regex .= "(\/([a-z0-9+\$_-]\.?)+)*\/?"; // Path 
    $regex .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?"; // GET Query 
    $regex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?"; // Anchor 

       if(preg_match("/^$regex$/i", $url)) // `i` flag for case-insensitive
       { 
               return true; 
       } 
?>

но ваш примерный URL-адрес упрощен, (\w+)\.(\w+) будет соответствовать ему. кто-то еще упомянул filter_var, который просто a filter_var($url, FILTER_VALIDATE_URL), но не похож на не-ascii, поэтому будьте осторожны...

Ответ 2

PHP filter_var - это то, что вам нужно. Найдите FILTER_VALIDATE_URL. Вы также можете установить flags для точной настройки вашей реализации.
Нет необходимости в регулярном выражении....

Ответ 3

Следующий код работал у меня:

if(filter_var($text, FILTER_VALIDATE_URL))
{
    echo "Yes it is url";
    exit; // die well
}
else
{
    echo "No it is not url";
   // my else codes goes
}

Вы также можете указать RFC соответствие и другие требования к URL-адресу с использованием флагов. Подробнее см. PHP Validate Filters.

Ответ 4

Проверьте, является ли он допустимым URL (example.com НЕ имеет значения).

    function isValidURL($url)
    {
        return preg_match('|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*
        (:[0-9]+)?(/.*)?$|i', $url);
    }

Как использовать функцию:

    if(!isValidURL($fldbanner_url))
    {
        $errMsg .= "* Please enter valid URL including http://<br>";
    }

Источник: http://phpcentral.com/208-url-validation-in-php.html

Ответ 5

Regexes - плохой способ проверить что-то сложное, как URL.

PHP filter_var() предлагает гораздо более надежный способ проверки URL-адресов. Плюс, это быстрее, так как это собственный код.

Ответ 6

Я не думаю, что есть окончательный ответ на этот вопрос. Пример действительного URL:

localhost
http://xxx.xxx.xxx/alkjnsdf
abs.com

Если у вас есть текст. и не большая его часть. Вы можете проверить, выполнив запрос CURL и посмотрите, возвращает ли он действительный ответ. В противном случае, если я ставлю localhost, это может быть ссылка, и это может быть что-то еще, и вы не сможете проверить это.

Ответ 7

Попробуйте следующее:

function isValidUrl($url) {
   return preg_match("(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»""‘’]))", $url) > 0;
}

(Источник регулярных выражений)

Ответ 8

Что-то вроде может работать для вас:

$arr = array('abc.com/foo',
'localhost',
'abc+def',
'how r u',
'https://how r u',
'ftp://abc.com',
'a.b');
foreach ($arr as $u) {
   $url = $u;
   if (!preg_match('#^(?:https?|ftp)://#', $url, $m))
      $url = 'http://' . $url;
   echo "$u => ";
   var_dump(filter_var($url, FILTER_VALIDATE_URL));
}

ВЫВОД:

abc.com/foo => string(18) "http://abc.com/foo"
localhost => string(16) "http://localhost"
abc+def => string(14) "http://abc+def"
how r u => bool(false)
https://how r u => bool(false)
ftp://abc.com => string(13) "ftp://abc.com"
a.b => string(10) "http://a.b"

Итак, в основном везде, где вы замечаете false как возвращаемое значение, которое является URL-адресом INVALID для вас.

Ответ 9

Вы можете использовать следующий шаблон регулярных выражений, чтобы проверить, является ли ваша переменная URL-адресом или нет:

$pattern = "\b(([\w-]+:\/\/?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/)))";