web-dev-qa-db-ja.com

文字列が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){
    // ???
}

JSがブロックされている場合にJavaScriptでチェックする以外の方法はありますか?

16
Reham Fahmy

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

_<?php 
    $regex = "((https?|ftp)\:\/\/)?"; // SCHEME 
    $regex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?"; // 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_について言及しましたが、これは単にfilter_var($url, FILTER_VALIDATE_URL)ですが、 非ASCIIが好きではないようです 文字なので、注意してください...

16
JKirchartz

PHPの filter_var 関数が必要です。 FILTER_VALIDATE_URL を探します。 flags を設定して、実装を微調整することもできます。
正規表現は必要ありません...

24
enygma

以下のコードは私のために働きました:

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
}

フラグを使用して、URLに [〜#〜] rfc [〜#〜] コンプライアンスおよびその他の要件を指定することもできます。詳細は PHP Validate Filters を参照してください。

21
user3078359

有効なURLかどうかを確認してください(example.comIS NOTvalid URL)

    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
Sindre

正規表現は、URLと同じくらい複雑なものを検証するための貧弱な方法です。

PHPの filter_var() 関数は、URLを検証するためのより堅牢な方法を提供します。さらに、ネイティブコードであるため、高速です。

4
greenie2600

次の正規表現パターンを使用して、変数がURLかどうかを確認できます。

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

これに対する決定的な答えはないと思います。有効なURLの例:

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

テキストがある場合。大量ではありません。 CURLリクエストを実行して、有効な応答が返されるかどうかを確認できます。そうでなければ、もし私がlocalhostを置いた場合、それはリンクである可能性があり、それは何か他のものである可能性があり、あなたはそれをチェックすることができません。

2
Churk

のようなものがあなたのために働くかもしれません:

$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であることに気づくでしょう。

1
anubhava