2013-12-13 73 views
1

我試圖符合以下視頻網址:與命令無關的正則表達式 - 有可能嗎?

<iframe width="420" height="315" src="//www.youtube.com/embed/F40ZBDAG8-o?rel=0" frameborder="0" allowfullscreen></iframe> 

我有以下幾點:

^<iframe 
(\swidth="\d{1,3}")? 
(\sheight="\d{1,3}")? 
(\salt=""[^""<>]*"")? 
(\stitle=""[^""<>]*"")? 
\ssrc="//(www.youtube.com|player.vimeo.com)/[-a-z0-9+&@#/%?=~_|!:,.;\(\)]+" 
(\sframeborder="[^""<>]*")? 
(\sallowfullscreen)? 
\s?/?></iframe>$ 

這是工作,但我不能依賴於一個事實,即YouTube將始終提供嵌入遵循此結構的鏈接。如果他們將width屬性移動到src之後,我的正則表達式將失敗。

有沒有辦法做到秩序無關的分組,來解決這個問題?

+0

你想匹配什麼?你想只得到src?或者你想從iframe中提取儘可能多的數據?另外,在一個真實世界的例子中,我會認爲'^ $'應該被移除 – HamZa

+0

@HamZa - 試圖匹配總是有'src'屬性總是以'vimeo'或'youtube'開頭的'iframe'。其他屬性 - 標題,寬度等是可選的。需要關閉標籤。 – RobVious

+0

@RobVious所以你甚至不需要寬度,高度,標題等?這意味着你可以簡單地使用'] + src \ s * =(「|')(。*?)\ 1 \ s * [^>] +>'現在由您來實施」檢查「尋找youtube或vimeo視頻:P – HamZa

回答

1

可以讓每個搜索詞的前瞻 - 這些不消耗字符串,使他們能夠以任意順序。例如:

<iframe (?=.*height="\d{1,3}")(?=.*width="\d{1,3}").* 

將同時匹配

<iframe width="123" height="321" 

<iframe height="321" width="123" 

demo on regex101.com

我相信你能完成這個自己(將所有要匹配的條件) 。

注意 - 這個「匹配」 - 它沒有「解壓」。但它會告訴你,所有這些術語都以任何順序出現在表達式中。

編輯自從我開始寫這個答案後,出現了一些評論,這些評論改變了我對你的請求的理解。如果你「只是」想提取src=的事情,你根本就

<iframe.*?src="([^"]+)" 

和匹配(括號裏的東西)將是無論是第一和第二雙引號之間。通常,比解析HTML的正則表達式有更好的工具 - 我個人的偏好是BeautifulSoup(Python)。