我使用這個正則表達式匹配的YouTube播放列表中的網址,並提取播放列表ID:的URL參數的正則表達式負先行
https://regex101.com/r/pO4dS6/31
不過,我不想正則表達式匹配,如果的一個參數是「v =」,它指定播放列表中的單個視頻。
在我上面的例子中,前2個URL應該匹配,最後3個不應該匹配。
我想使用負向預覽(?!v =),但它不工作。我錯過了什麼?
我使用這個正則表達式匹配的YouTube播放列表中的網址,並提取播放列表ID:的URL參數的正則表達式負先行
https://regex101.com/r/pO4dS6/31
不過,我不想正則表達式匹配,如果的一個參數是「v =」,它指定播放列表中的單個視頻。
在我上面的例子中,前2個URL應該匹配,最後3個不應該匹配。
我想使用負向預覽(?!v =),但它不工作。我錯過了什麼?
當試圖操縱網址數據,通常是使用網址解析技術的最佳做法。這使得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
我的方法:
我有一個正則表達式代碼的鏈接。我正在尋找一個正則表達式解決方案。 – johnh10
@ johnh10我知道,這不是一個錯誤。許多(很多)時間OP上的SO請求正則表達式時,它不是必要的使用正則表達式爲他們的項目。你會發現經常提供非正則表達式的答案,因爲正則表達式比非正則表達式函數方法明顯慢。如果你想要正則表達式,trincot的答案肯定沒有錯。 – mickmackusa
@ johnh10經過快速測試(不知道您的PHP版本和實際數據處理量)並且我們的答案同樣快速。我想我會說我的代碼會更容易閱讀/更新。 – mickmackusa
請添加所有相關代碼的實際問題,並且只使用外部鏈接作爲額外的引用。如果外部鏈接改變或被刪除,這個問題對於未來的訪問者將是無用的。 –