【发布时间】:2020-06-06 20:23:34
【问题描述】:
我开发了一个供我个人使用的应用程序,它解析从 Youtube 发送到我的电子邮件帐户的邮件消息,然后从每条消息中提取视频 url。
我一两个月用一次这个应用,下一个正则表达式完美运行了1~2年,也是我最后一次用这个应用:
C# 语法:
Regex urlRegex = new Regex("(content|href)=\"(?<url>(http|https)://www.youtube.com.+watch.+?)\"", RegexOptions.IgnoreCase);
VB.NET 语法:
Dim urlRegex As New Regex("(content|href)=""(?<url>(http|https)://www.youtube.com.+watch.+?)""", RegexOptions.IgnoreCase)
但是,今天我注意到它不再工作了......他们用来编写正文内容的模板发生了一些变化。
以消息中的正文内容为例:
这是它应该在“url”组名中匹配的内容:
https://www.youtube.com/attribution_link?a=IGCom2KEH-lFJgHW&u=/watch%3Fv%3DW0ToDn9jXW8%26feature%3Dem-lsp
这是它目前匹配的:
https://www.youtube.com/attribution_link?a=IGCom2KEH-lFJgHW&u=/"><img alt="Youtube Logo" class="header_logo_size" height="30" src="http://www.gstatic.com/youtube/img/branding/youtubelogo/1x/youtubelogo_60.png" border="0" style="display:block"></a> </td></tr></tbody></table></td></tr><tr><td style="max-height:0px; font-size:0; display:none"><hr class="inner-container-width" width="600" style="height:0px; border:none; border-color:transparent; padding:0px; margin:0px"></td></tr><tr><td class="large-section-padding-height" height="20"></td></tr><tr><td><table class="inner-container-width" width="600" align="center" valign="center" cellspacing="0" cellpadding="0" border="0"><tbody><tr><td><table class="video-spotlight-width" width="600" align="center" cellspacing="0" cellpadding="0" border="0"><tbody><tr style=""><td colspan="3"><a href="https://www.youtube.com/attribution_link?a=IGCom2KEH-lFJgHW&u=/watch%3Fv%3DW0ToDn9jXW8%26feature%3Dem-lsp" class="nonplayable" style="text-decoration:none; display:block"><table aria-label="Astrid S - Dance Dance Dance (Official Music Video)" class="video-spotlight-width" width="600" align="center" background="http://i.ytimg.com/vi/W0ToDn9jXW8/sddefault.jpg?sqp=-oaymwEGCIAFEOgC&rs=AMzJL3m-iY1ZW8EiY3QwRalAMfq3atBT-Q&feature=em-lsp" height="338" cellspacing="0" cellpadding="0" border="0" style="background-repeat:no-repeat; background-size:cover; background-position:center"><tbody><tr style=""><td aria-label="Astrid S - Dance Dance Dance (Official Music Video)"><img src="https://www.gstatic.com/youtube/img/email/transparent_pixel.png" alt="Astrid S - Dance Dance Dance (Official Music Video)" width="600" style="max-height:300px"> </td></tr><tr aria-label="Astrid S - Dance Dance Dance (Official Music Video)" scope="row" style=""><td aria-label="Astrid S - Dance Dance Dance (Official Music Video)" class="footer-font" valign="bottom" width="600" style="color:#fff; text-align:right; font-size:12px"><div style="margin-bottom:8px; margin-right:8px; border-radius:2px; background-color:#E62117; padding:2px 4px; display:inline-block">PREMIERE</div></td></tr></tbody></table></a></td></tr><tr><td><table class="large-section-padding-height" height="16" cellspacing="0" cellpadding="0" border="0"><tbody><tr><td class="large-section-padding-height" height="16"></td></tr></tbody></table></td></tr><tr><td><table class="content-container-width" width="560" cellspacing="0" cellpadding="0" border="0" style="table-layout:fixed"><tbody><tr><td class="avatar-size" width="32" style="vertical-align:top"><a href=""><img class="avatar-size" src="https://lh6.googleusercontent.com/-YdGE1ZRP_7k/AAAAAAAAAAI/AAAAAAAAAAA/lTcGNRWN4cc/s88-c-mo/photo.jpg" width="32" border="0" style="display:block; border-radius:50%"> </a></td><td class="small-pad-width" width="16"></td><td><table class="content-container-width" width="540" cellspacing="0" cellpadding="0" border="0" style="table-layout:fixed"><tbody><tr><td valign="center"><table class="content-container-width" cellspacing="0" cellpadding="0" border="0" style="table-layout:fixed"><tbody><tr><td style="padding-bottom:4px"><a href="https://www.youtube.com/attribution_link?a=IGCom2KEH-lFJgHW&u=/watch%3Fv%3DW0ToDn9jXW8%26feature%3Dem-lsp
(请注意正确的 url 匹配在字符串的最后。)
如何修复我当前的正则表达式以仅匹配我指定的 url 而忽略左侧的所有“垃圾”?
PD:我不需要考虑域名变体(例如 youtu.be )和其他不会在任何邮件消息中指定的内容的超级复杂的正则表达式。我也不想为此弄乱 HtmlAgilityPack 或类似的库,因为当 Youtube 更改正文内容中的任何小东西时,它需要更多的维护/更新。
【问题讨论】:
-
这就是为什么使用 DOM 解析器解析 HTML 是一个更好的主意。你可以试试
(content|href)=\"(?<url>https?://www\.youtube\.com/[^"]*watch[^"]*)\",直到下一次“更新”。 -
@Wiktor Stribiżew 经过大约 300 封邮件的测试,它按预期工作。非常感谢!!随时发布答案,以便我将其标记为已接受。