2009-07-02 12 views
2

私は自分自身を試してオンラインで検索してきましたが、この正規表現を書くのは成功しませんでした。正規表現による特定ドメインのURL検証

指定されたURLが特定のドメインのもので、正しい形式のリンク(PHPのもの)であることを検証する必要があります。たとえば、次のように

グッドドメイン:example.comからexample.com

だから、良いのURL:

だから、悪いのURLません:

いくつかの注意:私は "HTTP" を気にしない verus "https"しかし、あなたが "http"を常にとることに問題がある場合 この正規表現を使用するコードはPHPなので、それ。

UPDATE 2010:

グルーバーは偉大なURLの正規表現を追加します。

?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`!()\[\]{};:'".,<>?«»“”‘’])) 

は彼のポストを参照してください:An Improved Liberal, Accurate Regex Pattern for Matching URLs

+0

"良いドメイン"の例は、有効なURLではありません**(パスがありません)。 –

+0

@Nikolar Ruhe:パスは実際にはオプションです: "http://" hostport ["/" hpath ["?"検索URL] [RFC 1738参照] – Gumbo

+0

これは有効なURLではなく、例のURLで使用されている有効なドメインを示していますが、「blah.com」と言うだけで十分でしょう。いずれにせよ、私はその要点が作られたと思う。 – donohoe

答えて

5

それ

での私の刺し
<?php 

$pattern = "#^https?://([a-z0-9-]+\.)*blah\.com(/.*)?$#"; 

$tests = array(
    'http://blah.com/so/this/is/good' 
    , 'http://blah.com/so/this/is/good/index.html' 
    , 'http://www.blah.com/so/this/is/good/mice.html#anchortag' 
    , 'http://anysubdomain.blah.com/so/this/is/good/wow.php' 
    , 'http://anysubdomain.blah.com/so/this/is/good/wow.php?search=doozy' 
    , 'http://any.sub-domain.blah.com/so/this/is/good/wow.php?search=doozy' // I added this case 
    , 'http://999.sub-domain.blah.com/so/this/is/good/wow.php?search=doozy' // I added this case 
    , 'http://obviousexample.com' 
    , 'http://bbc.co.uk/blah.com/whatever/you/get/the/idea' 
    , 'http://blah.com.example' 
    , 'not/even/a/blah.com/url' 
); 

foreach ($tests as $test) 
{ 
    if (preg_match($pattern, $test)) 
    { 
    echo $test, " <strong>matched!</strong><br>"; 
    } else { 
    echo $test, " <strong>did not match.</strong><br>"; 
    } 
} 

// Here's another way 
echo '<hr>'; 
foreach ($tests as $test) 
{ 
    if ($filtered = filter_var($test, FILTER_VALIDATE_URL)) 
    { 
    $host = parse_url($filtered, PHP_URL_HOST); 
    if ($host && preg_match("/blah\.com$/", $host)) 
    { 
     echo $filtered, " <strong>matched!</strong><br>"; 
    } else { 
     echo $filtered, " <strong>did not match.</strong><br>"; 
    } 
    } else { 
    echo $test, " <strong>did not match.</strong><br>"; 
    } 
} 
+0

' parse_url'関数は、URLを検証するためのものではないことを示しています。無効なURLは引き続き解析されます。したがって、いくつかの追加チェックが必要です。 –

+0

ああ、私は同意する - それはおそらくより厳格なテストが必要です。それでも、私の正規表現ソリューションはまったく同じように動作します。 –

+0

あなたの投稿の論理を第2のalgoに採用しました。うまくいくように見えます! –

0
\b(https?)://([-A-Z0-9]+\.)*blah.com(/[-A-Z0-9+&@#/%=~_|!:,.;]*)?(\?[A-Z0-9+&@#/%=~_|!:,.;]*)? 
+0

私はそれがhttp://blah.com.evil.domain(AZがA-Za-zであると仮定)を許可すると思います –

+0

コメントシステムは前の例からhttp-:を取り除きました... –

0
!^https?://(?:[a-zA-Z0-9-]+\.)*blah\.com(?:/[^#]*(?:#[^#]+)?)?$! 
1

おそらく:

^https?://[^/]*blah\.com(|/.*)$ 

編集:

http://editblah.com

^https?://(([^/]*\.)|)blah\.com(|/.*)$ 
+0

閉じる!しかし、これはfooblah.comのような誤ったポジティブなドメインになります –

7

から保護しますが、正規表現を使用する必要がありますか? PHPには、このようなことをするための機能が組み込まれています。 URLが有効であれば

filter_var($url, FILTER_VALIDATE_URL) 

はあなたを教えてくれる、と

$domain = parse_url($url, PHP_URL_HOST); 

はあなたにそれが参照するドメインを教えてくれます。

これは、ある種の狂った正規表現よりもはっきりしており、保守性が高いかもしれません。