2017-08-06 33 views
0

我使用這個正則表達式匹配的YouTube播放列表中的網址,並提取播放列表ID:的URL參數的正則表達式負先行

https://regex101.com/r/pO4dS6/31

不過,我不想正則表達式匹配,如果的一個參數是「v =」,它指定播放列表中的單個視頻。

在我上面的例子中,前2個URL應該匹配,最後3個不應該匹配。

我想使用負向預覽(?!v =),但它不工作。我錯過了什麼?

+0

請添加所有相關代碼的實際問題,並且只使用外部鏈接作爲額外的引用。如果外部鏈接改變或被刪除,這個問題對於未來的訪問者將是無用的。 –

回答

2

您只測試立即發生的v=。允許一些其他字符任選.*它的前面:

(?!.*v=) 

上看到regex101

更新它可能是更安全的檢查必須先於v=以及性格:

(?!.*[?&]v=) 

查看更新日期regex101

+0

是的!感謝您解釋它。我不知道我需要通配符 - 我以爲默認情況下包含了這個預覽。 – johnh10

0

當試圖操縱網址數據,通常是使用網址解析技術的最佳做法。這使得parse_url()成爲一個直觀的候選人。

你沒有表現出你的編碼嘗試(和你還是應該),但如果你能考慮非正則表達式的解決方案,這將是可靠的:(Demo

$in=['https://www.youtube.com/playlist?list=PLFgquLnL59akaNTxtgsoKn4c0Q8utjqku', 
'http://www.youtube.com/embed/videoseries?list=PLdwCuEoZ_6l6C47ciTvf6Z2GArUOCHHQ3', 
'https://www.youtube.com/watch?v=VTMcqVFk39s&index=2&list=PLxgKRG5rfVFa067PHSpju_XaTPiyii31L', 
'https://www.youtube.com/watch?v=TpbTkbv4L2Y&list=PLvqxe4XbcSiEzrZm28NjsLXmHkffCJmBY&index=2', 
'https://www.youtube.com/watch?index=2&list=PLxgKRG5rfVFa067PHSpju_XaTPiyii31L&v=VTMcqVFk39s']; 
foreach($in as $v){ 
    parse_str(parse_url($v)['query'],$array); 
    echo (!isset($array['v'])?$array['list']:'disqualified'),"\n"; 
} 

輸出:

PLFgquLnL59akaNTxtgsoKn4c0Q8utjqku 
PLdwCuEoZ_6l6C47ciTvf6Z2GArUOCHHQ3 
disqualified 
disqualified 
disqualified 

我的方法:

  • 解析每個URL成組件的陣列,
  • 訪問「查詢」元件,
  • 鍵 - 值對的字符串轉換爲關聯數組,
  • 檢查「V」作爲關鍵字的存在,
  • 如果沒有「V」,訪問/輸出「列表」值,
  • 如果「v」輸出「取消資格」
+0

我有一個正則表達式代碼的鏈接。我正在尋找一個正則表達式解決方案。 – johnh10

+0

@ johnh10我知道,這不是一個錯誤。許多(很多)時間OP上的SO請求正則表達式時,它不是必要的使用正則表達式爲他們的項目。你會發現經常提供非正則表達式的答案,因爲正則表達式比非正則表達式函數方法明顯慢。如果你想要正則表達式,trincot的答案肯定沒有錯。 – mickmackusa

+0

@ johnh10經過快速測試(不知道您的PHP版本和實際數據處理量)並且我們的答案同樣快速。我想我會說我的代碼會更容易閱讀/更新。 – mickmackusa