2011-06-28 15 views
0

のために、私は、この正規表現とその作業に近いが、その中に一つだけ多くの問題を働いた、それは、複数の期間で任意の単語に一致するPHP正規表現がURL

例えば(。):STUF ...(マッチしました)

正規表現で「ブラケットの1セットあたり1つの期間のみ許可」に期間を制限するにはどうすればよいですか?

'#((\w+://)?(\w+\.)([a-z0-9\-/.?=_&%])+)#i' 
+1

\。{1}は正常に動作しますが、私はPHPが分かりません:-) –

+1

テキスト内のリンクを置き換えるpreg_matchです。だから、おそらくフィルターは助けにならなかっただろうか 私は{1}を試しましたが、入力するとエラーが発生します: '#((\ w +://)?(\ w + 1}?= _&%]))+)#i ' – pakito

+0

URLについての質問をするときにRFCを参照しているパキト?プロトコルも知っていると良いでしょう。これは具体的にはhttpとhttpsのプロトコルですか? – hakre

答えて

0

はこれを試してみてください。

しかし、私はこのような何かをお勧めします:

'#((\w+://)?\w+(\.[a-z0-9\-]+)*\.[a-z\-]{2,}(/[\w\-./?=&%]*)?)#i' 
+0

残念なことに、このhttp://。sample.-comのようなaccepst URIは無効です(ダッシュを最初の文字にすることはできません)。 –

+0

@Igor:はい、正当なURIの正しいRegExは長すぎます... – Floern

+0

lol私はhttp://.-sample.-comでfacebookでテストし、有効なURLとしても受け入れています。 – pakito

0

これは動作するはずです:

[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4} 

問題を使用している正規表現では、あなたの期間を含む文字クラスに貪欲バージョン「+」を使用していることです。私がここに投稿した正規表現は、その名前の中の1つのperdiodだけをチェックします。

このパターンは、google.com、www.google.com、任意の数のサブドメインと正常に一致します。

注:は最近、間もなくいずれかの最上位ドメイン(たとえば.com、.orgなどの代わりにすぐに許可されるものなど)を許可すると発表したため、最後の部分を調整する必要がありますTLDはまもなく任意の長さになるだろうから、正規表現の "{2,4}"になる。

'#((\w+://)?(\w+)(\.[a-z0-9\-/?=_&%]+)+)#i' 

これは、各期間の後に非期間-文字が必要です。

+0

既に「博物館」で欠落しています。 –

+0

ありがとうございましたノーマルは、(tld)私も同様に避けようとしているものです。 – pakito

+0

ああ、博物館がすでに使用されていたことはわかりませんでした。さて、あなたは本質的にany.combination.of.valid.characters.delimeted.by.periods.without.spaces.not.ending.in.a.punctuationを探しているので、もう少し難しくなります。 mark:S偽陽性の可能性の増加から挑戦します。私はあなたがそれを試して何が起こるか見る必要があるだろうと思う。 – jefflunt

0
あなたがURLを検証したい場合

さて、なぜ使用しない場合でもparse_url()?