2016-11-24 40 views
-1

我在舊網站上工作,我需要修復我的YouTube鏈接。 例如,我有以下內容的字符串變量:「suEGD8aaSzI列表& playauto = 1」C#正則表達式 - 提取YouTube查詢字符串參數

<h1>title</h1> 
<p> 
some text here 
....... 
<iframe src="http://www.youtube.com/embed/suEGD8aaSzI?list&playauto=1" width="560" height="315" frameborder="0" scrolling="auto"></iframe> 
....... 
</p> 
</p> 

我試圖讓參數之外, 做到以下幾點:

lblContent.Text = Regex.Replace(ArticleContent, @"myRegularExpressionHere", "https://www.youtube.com/embed/$1", RegexOptions.IgnoreCase); 

到目前爲止,它的最好的是我能找到的:

https?:\/\/(?:[0-9A-Z-]+\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v\=))([\w-]{10,12})(?:[\&\?\#].*?)*?(?:[\&\?\#]t=([\dhm]+s))?(?=") 

,但它是不夠的,因爲我只得到「suEGD8aaSzI」一一個參數,查詢字符串的其餘部分:「?list & playauto = 1」不包括在裏面。

幫助將非常感激。

+0

嘗試拆分(/)上的url字符串,並且最後一個索引將爲您提供complate所需的字符串。但只有在你的查詢字符串中沒有任何斜線時,這纔會起作用。 – Manish

+0

基本上,查詢從**?**符號開始,因此您可以執行** meUrl = meUrl.Substring(meUrl.LastIndexOf(「?」))**以僅獲取查詢字符串。然後你可以通過** var query = meUrl.Split(「&」,SplitOptions.IgnoreEmptyEntities)**解析查詢字符串。現在變量**查詢**應該包含類似** {「q1 = 123」,「q2 = somehting」} **的內容。 –

+0

問題是我在這個字符串變量裏面有一個完整的html內容,所以我仍然需要提取這些外部的youtube鏈接。 – serg90

回答

0

我認爲,如果你想有一個正則表達式這會工作:

^.+/([^/]+)$ 

它基本上是說走過去「/」字符後的一切。

+0

不適合我。此外,它必須停止在「符號,所以其他html標籤和屬性不會被破壞。 – serg90

+0

對不起,錯過了它是在html。我認爲你要找的答案在這裏:http://stackoverflow.com/問題/ 3717115 /正則表達式換的YouTube鏈接 – MrApnea

0

您可以使用此方法:

const string PATTERN = @"(?'iframe'<iframe .+(?'link'youtube.com\/embed\/.+?)\")"; 

Match match = new Regex(PATTERN, RegexOptions.Multiline).Match(meUrl); 
if(match.Success){ 
    string link = match.Groups["link"].Value; 
    // link is now youtube.com/embed/suEGD8aaSzI?list&playauto=1 
    string query = link.Substring(link.LastIndexOf("?") + 1); 
    // query is now list&playauto=1 
    string[] splittedQuery = quert.Split("&", StringSplitOptions.IgnoreEmptyEntries); 
    // splittedQuery is not { "list", "playauto=1" } 
    Dictionary<string, string> fullQueryWithValues = new Dictionary<string,string>(); 
    foreach(string queryFromSplit in splittedQuery){ 
     KeyValuePair<string, string> queryWithValues = new KeyValuePair<string, string>(queryFromSplit.Split("=", StringSplitOptions.IgnoreEmptyEntries)[0], queryFromSplit.Contains("=") ? queryFromSplit.Split("=", StringSplitOptions.IgnoreEmptyEntries)[1] : string.Empty); 
    } 
} 

Online regex check tool

這是從磁頭寫入,因此它可以有一些問題。當我回到家時,會重寫這個:)

0

我可以建議它可以幫助將問題分解成更小的步驟。例如,如果您使用了HTML解析器,則您將能夠瀏覽內容,而無需擔心因爲它們採用類似於XML的格式而只能轉義的解除轉義值。然後,您可以將「src」屬性(以及其他任何可能具有該鏈接的屬性)傳遞到System.Uri的構造函數中,並挑出需要的那個URI的位。而像System.Web.HttpUtility.ParseQueryString這樣的東西可以幫助你處理參數。所有這些都說了,如果你只是想根據你給出的例子做一些粗糙和準備的事情,我會建議這個,它基於在「src =」之後尋找引用的字符串。 (即我假設的URI不包含雙引號,我完全知道這是一個合理的假設而不是)。

Regex pattern = new Regex(@"\ssrc\s*=\s*""([^""]+)""", RegexOptions.IgnoreCase); 
Match match = pattern.Match(example); 
string value = match.Result("$1"); 

然後,您可以將值放在Uri構造函數中,並按上面所述進行解析。