2017-03-03 15 views
4

有効なオンラインURLと一致する正規表現を探しています。例えば正規の有効なURLと一致するPHP Regex

exmaple.com 
http://exmaple.com 
https://exmaple.com 
www.exmaple.com 
http://www.example.com 
https://www.example.com 

などの特殊なドメインと拡張子:

t.co 
example.deals 
sh.party 

そしてそうではなく、2.3.3.1ようftpgetクエリまたはURLのようなすべての複雑なものとは一致しません。

私は'#(www\.|https?://)?[a-z0-9]+\.[a-z0-9]{2,4}\S*#i'を使用していましたが、の日付をと検出します。たとえば、3.3.2017です。

私はすべての見つかったURLにget_headersを適用し、このbecuaseを必要とする、と私は日付のような無効なURLのget_headersを行うときに、私が取得:

get_headers(http://03.03.2017): failed to open stream: Connection timed out

TL; DR:私は探していますと一致する正規表現の場合は、のURLをget_headers()に適用することができます。

ありがとうございます!

+0

数字を含むトップレベルドメインはありますか?そして、btw 'deals'には5つのchrsがあります。 – JosefScript

+0

@ JosefScriptは、 '12345.com'のようなドメインに問題はないようですが、数字の拡張子がないだけです。 –

+0

正規表現は「オンラインURL」を伝えることはできません。パターンにのみ一致します。ドメインのパターンにマッチさせることも難しくなります。 'chris.inc'は会社名かドメインですか? – chris85

答えて

2

Regexは有効なURLをチェックするのに最適なソリューションではないと言います。開始時に任意のHTTPまたはHTTPS:

<?php 
$url = "https://www.w3schools.com"; 

if (!filter_var($url, FILTER_VALIDATE_URL) === false) { 
    echo("$url is a valid URL"); 
} else { 
    echo("$url is not a valid URL"); 
} 
?> 
+0

「http:// 23.2017」がこのテストに合格しました。 –

+0

IPアドレスの場合は、FILTER_VALIDATE_IPを使用して検証できます。両方を使用すると、問題を解決することができます。 – fabionvs

+0

正確には、 '23.2017'はIPではありません。なぜなら、2017は255より大きいからです。私のコードでは、get_headers()に何か他のものを渡すと接続がタイムアウトし、Webサイトに遅れるので、URLだけを検出する必要があります。 –

1
#(https?:\/\/)?([a-z0-9_~-]+\.)+[a-z]{2,5}(\/\S*)?#i 

EDIT:3回目はFILTER_VALIDATE_URLを使う方が良いでしょう。その後、少なくとも1つのドメイン名と1つのドット、2〜5文字のトップレベルドメイン、バックスラッシュと空白以外の追加のテールが続きます。

+0

良い見えますが、この正規表現は' example.com:) 'のようなURLを受け入れますこのURLは無効なので、 'get_headers'です。 –

+0

私は[LinkifyJS](http://soapbox.github.io/linkifyjs/)と同様のものを探していますが、PHPではそうです。私はソースコードからその正規表現を見つけることができませんでした。 –

関連する問題