C#正则表达式 - 提取YouTube查询字符串参数
问题描述:
我在旧网站上工作,我需要修复我的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”不包括在里面。
帮助将非常感激。
答
您可以使用此方法:
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);
}
}
这是从磁头写入,因此它可以有一些问题。当我回到家时,会重写这个:)
答
我可以建议它可以帮助将问题分解成更小的步骤。例如,如果您使用了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构造函数中,并按上面所述进行解析。
尝试拆分(/)上的url字符串,并且最后一个索引将为您提供complate所需的字符串。但只有在你的查询字符串中没有任何斜线时,这才会起作用。 – Manish
基本上,查询从**?**符号开始,因此您可以执行** meUrl = meUrl.Substring(meUrl.LastIndexOf(“?”))**以仅获取查询字符串。然后你可以通过** var query = meUrl.Split(“&”,SplitOptions.IgnoreEmptyEntities)**解析查询字符串。现在变量**查询**应该包含类似** {“q1 = 123”,“q2 = somehting”} **的内容。 –
问题是我在这个字符串变量里面有一个完整的html内容,所以我仍然需要提取这些外部的youtube链接。 – serg90