2011-12-14 5 views
3

クエリ文字列(パラメータは&で区切られています)を持つURLに対してPHP検証関数が必要です。現在、私はPHPを使用したクエリ文字列検証を使用するURL

$pattern = '/^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)[email protected])?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?$/'; 

echo preg_match($pattern, $url); 

この機能をURLを検証するため、以下の機能が正しくなど

...

google.com www.google.com http://google.com http://www.google.comのような入力を検証してきました。しかし、これはURLを検証しません。パラメータ(クエリ文字列)が付属しています。たとえば。

http://google.com/index.html?prod=gmail&act=inbox 

両方のタイプのURL入力を受け入れる機能が必要です。助けてください。前もって感謝します。

答えて

2

シンプルfilter_var

if(filter_var($yoururl, FILTER_VALIDATE_URL)) 
{ 
    echo 'Ok'; 
} 

スキーマに先行していないURLに問題があるものの、トリックを行う可能性があります: http://codepad.org/1HAdufMG

あなたはURLの前でhttp://を配置することによって、問題を回避変えることができますが、それなし。 filter_var()関数を供給する前に

$parsed = parse_url($url); 
if (!isset($parsed['scheme'])) $url = "http://$url"; 

:@DaveRandomによって示唆されるように
は、あなたのような何かを行うことができます。

、それはそれはまた利用できるこれらのフラグがある...しかし、まだ

いくつかの余分な複雑な正規表現よりも単純なソリューションです全体:

FILTER_FLAG_PATH_REQUIRED FILTER_VALIDATE_URLは にURLを必要とパス部分を含んでいます。 FILTER_FLAG_QUERY_REQUIRED FILTER_VALIDATE_URL URLにクエリ文字列を含める必要があります。

+1

FTRとして試してみることができ、私は確認することが最も賢明なアプローチを考えるかもしれませんschemeは '$ parsed = parse_url($ str);となります。 – DaveRandom

+0

コメントありがとうございました –

+0

私はURIにクエリが存在するかどうかをチェックするためにParse_urlを使いました。 :) –

0

http://php.net/manual/en/function.parse-url.php

いくつかは、これは100%の防弾ではないと思います
しかし、あなたが開始

+1

'この関数は指定されたURLを検証するためのものではありませんが、上記の部分に分割するだけです。 ' –

+0

@DamienPirsy実際に、私は再生を開始するまで、これを正確に答えるつもりでした私は実際にそれが偽に戻るようなものを思い付くことができないことを発見しました。 \ "\ x00"や "" [email protected] ""を渡しても、それは中断されません... – DaveRandom

関連する問題