2012-01-24 25 views
3

に言葉を一致させるために、私はマッチする正規表現が必要です。正規表現URL

http://example.com/foo 
http://example.com/foo/ 
http://example.com/foo/bar 

ではなくを:

http://example.com/foobar 

http://example.com/foo/?を使用すると、3種類に一致するが、それは私ドンというあまりにも/foobarに一致します欲しい。正規表現に何を追加して/foobarと一致しないのですか?

答えて

4

この方法を試してください。

^http://example\.com/foo(?:/.*)?$ 
+0

これを回答としてマークします。 FlopCoderのソリューションも機能しますが、私はこれをもっとうまく使っています。ご協力いただきありがとうございます! –

+0

@gergoerdosi:どうぞよろしく。 – Toto

1

正規表現では、最後の/?は、最後にオプションの/を意味します。したがって/foobarも一致します。これを試してみてください :これはexample.com/fooまたはexample.com/foo/bar一致します

/http:\/\/example.com\/foo(?:\/|\/(\w+)|)/ 

:正規表現の形式で

http://example.com/foo(?:\/|/(\w+)|) 

http:\/\/example\.com\/foo($|\/.*) 
+0

のhttp:\/\ /例\ .COM \/fooの\ /.*がより良いフィットかもしれません。 – synthesizerpatel

+1

Argh。傾いているスラッシュ症候群! –

+0

これは最初の例と一致しません。 – Toto

0

はこのような何かを試してみてくださいまたはexample.com/foo/


いくつか、について説明:

  • (foo|bar)がfooと一致するか、開始中?:のグループが
  • \/をキャプチャされていません
  • (?:)をバーエンド
  • \/(\w+)マッチA /付きで/にマッチします1回以上繰り返される単語の文字
  • |)は、文字列の最後には何も一致しません。
+0

たぶんそれは私のものですが、これを動作させることができませんでした。それでも/ foobarとマッチしました。 FlopCoderのソリューションが動作します。とにかく助けてくれてありがとう。 –

0

私はこのために否定先読み(?!)を使用します。

$urls = array(
    'http://example.com/foo', 
    'http://example.com/foo/', 
    'http://example.com/foo/bar', 
    'http://example.com/foobar' 
); 

foreach ($urls as $url) { 
    if (preg_match('#^http://example\.com/foo(?!bar)#', $url)) { 
     echo $url, " matches.\n"; 
    } else { 
     echo $url, " does NOT match.\n"; 
    } 
} 

// Output: 
// http://example.com/foo matches. 
// http://example.com/foo/ matches. 
// http://example.com/foo/bar matches. 
// http://example.com/foobar does NOT match. 
+0

私は一般的に '/ foobar'、'/food'、 '/ foo-fighters'にマッチしたくないと思います。あなたは、あなたがマッチングを避けることを前もって知らない。 – Tenner

+0

正確には、/ foobarは単なる例でした。 –

+0

@Tenner:ああ、大丈夫、私の間違い。私はそれは先行するスラッシュがない場合、テキストの特定のビット( "バー")に一致しないようにしようとしていることを意味するためにそれを取った。 – FtDRbwLXw6