【发布时间】:2016-11-01 16:34:03
【问题描述】:
我正在尝试用动态创建的电子邮件模板中的缩略图替换嵌入的 YouTube 视频。我试图从每个嵌入式 URL 中找到每个 YouTube ID,然后用自定义 HTML 替换整个块。如果只有一个带有以下正则表达式的嵌入视频,我就可以正常工作:
<span contenteditable="false" draggable="true" fr-original-class="fr-video\sfr-dvb\sfr-draggable"\s.*\ssrc="[a-z:]*?\/\/w{3}?.?youtube.com\/embed\/([a-zA-Z\d\-]*).*<\/iframe><\/span>
问题是,如果有多个视频,它只会从最后一个视频中找到 ID。我觉得我可能过于复杂了。
请注意,嵌入视频所在的 span 的属性将始终相同 (contenteditable="false" draggable="true" fr-original-class="fr-video)。
下面是一个示例电子邮件模板,上面的 RegEx 仅从中提取第二个 ID,而不是第一个。我想两个都拉。
这是在 Ruby 中完成的。
编辑:我意识到我正在使用的 RegEx 可能有点矫枉过正,但我需要一个复杂的 RegEx 来替换 gsub,以便我只替换视频及其容器,而不是它周围的任何东西。
<!DOCTYPE html>
<html>
<head>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'>
</head>
<body style='margin: 0px; font-family: Helvetica Neue,Helvetica,Arial,sans-serif; font-size: 18px;'>
<table border='0' cellpadding='0' cellspacing='0' style='font-family: Helvetica Neue,Helvetica,Arial,sans-serif; width: 600px;' width='600'>
<tr>
<td>
FooBar
<br>
<br>
<span contenteditable="false" draggable="true" fr-original-class="fr-video fr-dvb fr-draggable" fr-original-style="-webkit-user-select: none;" style="-webkit-user-select: none; text-align: center; position: relative; display: block; clear: both;">
<iframe src="//cdn.embedly.com/widgets/media.html?src=https://www.youtube.com/embed/e7zCqsjK1Vg?feature=oembed&url=http://www.youtube.com/watch?v=e7zCqsjK1Vg&image=https://i.ytimg.com/vi/e7zCqsjK1Vg/hqdefault.jpg&key=2aa3c4d5f3de4f5b9120b660ad850dc9&type=text/html&schema=youtube" width="600" height="338" scrolling="no" frameborder="0" allowfullscreen="" style="box-sizing: content-box; max-width: 100%; border: 0px;" fr-original-style="box-sizing: content-box; max-width: 100%; border: 0px;" fr-original-class="embedly-embed"></iframe>
</span>
<br>
Foo Bar
<br>
<br>
<span contenteditable="false" draggable="true" fr-original-class="fr-video fr-dvb fr-draggable" fr-original-style="-webkit-user-select: none;" style="-webkit-user-select: none; text-align: center; position: relative; display: block; clear: both;">
<iframe src="//cdn.embedly.com/widgets/media.html?src=https://www.youtube.com/embed/skLz87ixE48?feature=oembed&url=http://www.youtube.com/watch?v=skLz87ixE48&image=https://i.ytimg.com/vi/skLz87ixE48/hqdefault.jpg&key=2aa3c4d5f3de4f5b9120b660ad850dc9&type=text/html&schema=youtube" width="600" height="338" scrolling="no" frameborder="0" allowfullscreen="" style="box-sizing: content-box; max-width: 100%; border: 0px;" fr-original-style="box-sizing: content-box; max-width: 100%; border: 0px;" fr-original-class="embedly-embed"></iframe>
</span>
<br>
</td>
</tr>
<tr style='font-family: Helvetica Neue,Helvetica,Arial,sans-serif; font-size: 12px; color: #656565; text-align: center;'>
<td style='padding: 10px 0px;'>
</td>
</tr>
</table>
</body>
</html>
【问题讨论】:
-
所以如果我理解正确的话,你想用正则表达式做两件事吗?其中之一是删除包含 YouTube 嵌入的
<span>...</span>s?第二个是捕获这些 YouTube 嵌入的 ID? -
@wcarroll 是正确的。分开做这两个操作很好。我想匹配嵌入的 ID,对于我找到的每个 ID,用我生成的自定义 HTML 替换 YouTube 嵌入及其容器。我当前的 RegEx 找到了第一个嵌入的开头 (
<span>) 并与第二个嵌入的结尾 (</span>) 匹配,这显然不是我想要的。 -
强烈建议您在处理 HTML 或 XML 时使用解析器而不是正则表达式。有关历史讨论,请参阅 stackoverflow.com/questions/1732348/…。 Ruby 的实际解析器是Nokogiri。 Nokogiri 无需使用
sub或gsub即可轻松查找特定节点、提取信息和修改DOM。 -
@theTinMan 这绝对比使用
gsub更有意义。感谢您的提醒。