C#正则表达式 - 提取youtube查询字符串参数

时间:2016-11-24 11:13:32

标签: c# regex youtube

我正在一个旧网站上工作,我需要修复我的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>

我尝试获取参数&#34; suEGD8aaSzI?list&amp; playauto = 1&#34;外, 做以下事情:

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))?(?=")

但这还不够,因为我只得到&#34; suEGD8aaSzI&#34;作为参数,查询字符串的其余部分:&#34;?list&amp; playauto = 1&#34;不在里面。

帮助将非常感谢。

3 个答案:

答案 0 :(得分:0)

我认为如果你想要一个正则表达式,这将有用:

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

它基本上是说在最后一个'/'字符后取一切。

答案 1 :(得分: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

这是从头部写的,所以它可能有一些问题。当我回到家时会重写这个:)

答案 2 :(得分:0)

我可以建议将问题分解为更小的步骤可能会有所帮助。例如,如果您使用HTML解析器,则可以导航内容,而无需担心仅因为它们是类似XML的格式而被转义的非转义值。然后你可以通过&#34; src&#34;将属性(以及其他可能有链接的东西)放入System.Uri的构造函数中,并选择所需的URI中的任何位。像System.Web.HttpUtility.ParseQueryString这样的东西可以帮助你处理参数。

所有这一切,如果你只是想要一些粗略和准备好的东西,基于你给出的例子,我建议这是基于在&之后寻找引用的字符串#34; SRC =&#34; (即我假设URI不包含双引号,我完全清楚它是不是合理的假设)。

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

然后你可以将值放在Uri构造函数中,并按照上面的描述进行解析。