2016-11-24 105 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构造函数中,并按上面所述进行解析。