動的に作成された電子メールテンプレートのサムネイルに埋め込みのYouTube動画を置き換えようとしています。埋め込まれた各URLから各YouTube IDを見つけようとしていて、ブロック全体をカスタムHTMLに置き換えようとしています。複数のビデオがある場合HTML(Ruby)でURLパラメータを検索するRegex
<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を検索します:私は、次の正規表現を持つ唯一の1つの埋め込み動画がある場合、それは働いています。私はこれを過度に複雑にしているように感じる。
埋め込みビデオが入っているスパンの属性は、常に同じであることに注意してください(contenteditable="false" draggable="true" fr-original-class="fr-video
)。
サンプルのメールテンプレートは以下のとおりです。上記の正規表現は、最初のIDではなく、2番目のIDのみを取得します。私は両方を引っ張りたい。
これはRubyで行われています。
編集:私はおそらく残虐ですが、私はgsub
のために複雑なRegExが必要なので、私はビデオとそれを囲むものではなく、コンテナで置き換える必要があります。
<!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>
これを正しく理解すれば、正規表現で2つのことをしようとしていますか?そのうちの1つは、YouTube埋め込みを含む「 ...」を削除することですか?もう1つは、YouTube埋め込みのIDを取得することです。 – wpcarro
@wcarrollは正しいです。 2つの操作を別々に行うのは問題ありません。埋め込みIDを一致させたいと思います。見つけたIDごとに、YouTubeの埋め込みコードを置き換えて、コンテナにカスタムHTMLを挿入します。私の現在のRegExは、最初の埋め込み( ' ')の開始点を見つけ、2番目の埋め込みの最後と一致します(' ')。 – tommybond
HTMLやXMLを扱うときは、正規表現ではなくパーサーを使用することを強くお勧めします。歴史的な議論については、http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags?rq=1を参照してください。 Rubyのデファクトパーサーは[Nokogiri](http://www.nokogiri.org)です。 Nokogiriは、 'sub'や' gsub'を使わずに特定のノードを見つけたり、情報を抽出したり、DOMを変更したりするのを容易にします。 –