2011-11-29 149 views
4

我使用這個正則表達式來驗證youtube網址。正則表達式YouTube網址

^http:\/\/(?:www\.)?youtube.com\/watch\?(?=.*v=\w+)(?:\S+)?$ 

它很好用。

但我有這個問題。

如果用戶輸入http://www.youtube.com/watch?v=zcKEjSYJVLs&feature=topvideos_sports它工作正常

現在我想避免粘貼多次(三次在我們的例子)本

http://www.youtube.com/watch?v=zcKEjSYJVLs&feature=topvideos_sportshttp://www.youtube.com/watch?v=zcKEjSYJVLs&feature=topvideos_sportshttp://www.youtube.com/watch?v=zcKEjSYJVLs&feature=topvideos_sports 

相同的URL。對於這個正則表達式,它也是一個有效的youtube地址。

我正在尋找解決方法。

回答

7

不要讓?後的第一個:

^http:\/\/(?:www\.)?youtube.com\/watch\?(?=[^?]*v=\w+)(?:[^\s?]+)?$ 

查詢參數的實際?應該逃脫,所以這種做法不應排除任何有效的URL。

+0

謝謝你!這真的很簡單...... :)我很生氣,我什至不能想到.. :) – TriNitroToluene

1

什麼

^http:\/\/(?:www\.)?youtube.com\/watch\?(?=.*v=\w+)(?:(?:\S(?!http))+)?$ 

看到它here on Regexr

我改變了最後一部分(?:\S+)?(?:(?:\S(?!http))+)?這意味着,匹配下一個非空白字符(\S)只有當它的後面沒有「HTTP」( (?!http)

+0

爲什麼不只是重複youtube位?像:'^ http:\/\ /(?: www \。)?youtube \ .com \/watch \?(?=。* v = \ w +)(?:(?:\ S(?!http: \/\ /(?: www \。)?youtube \ .com))+)?'' – fncomp

+0

@josh因爲它這麼久?沒有什麼,有很多組合可以實現這一點,可能在我的前瞻中添加'://'是很好的選擇。順便說一句,你的不工作,我把它放入Regexr鏈接,它的匹配也是重複的地址。 (不知道爲什麼) – stema

+0

糟糕,我錯過了那裏。這實際上對我更有意義:'^ http:\/\ /(?: www \。)?youtube.com \/watch \?(?=。* v = \ w +)(?:(?:\ S (?!{0,}的YouTube \ .COM。{0,}))+)?$'。猜猜我會作爲一個單獨的答案發布。 – fncomp

2
^http:\/\/(?:www\.)?youtube.com\/watch\?(?=.*v=\w+)(?!\S+http:\/\/)(?:\S*)$ 

應該做的伎倆!

在實際匹配字符串上留下的內容之前使用負向預測。 :)

1

如果你只關心一個雙貼那麼也許嘗試這個表達式(基地唐@ STEMA的答案):

^http:\/\/(?:www\.)?youtube\.com\/watch\?(?=.*v=\w+)(?:(?:\S(?!.{0,}youtube\.com‌​.{0,}))+)?$ 
1

Ruby on Rails的4抱怨使用^和$,因爲可能的腳本注入的可能性。在這裏它被編輯,以避免該警告以及也接受https

/\Ahttps?:\/\/(?:www\.)?youtube.com\/watch\?(?=.*v=\w+)(?:\S+)?\z/