用嵌入代码替换 YouTube HTML 链接

Replacing YouTube HTML links with embed code

我正在用 markdown 编写网页并使用 md2html 工具将它们转换为 HTML。我想处理输出 HTML 文件并找到任何像这样的 youtube link:

<a href="https://www.youtube.com/watch?v=abcdefgh887">https://www.youtube.com/watch?v=abcdefgh887</a>

并将其替换为嵌入代码:

<iframe width="560" height="315" src="https://www.youtube.com/embed/abcdefgh887?controls=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

我稍微玩了一下 Grammars,主要是为了熟悉它们,但得出的结论是这可能不是这项工作的理想工具。另外,我更愿意使用易于适应其他类似任务的现有模块,而不是推出我自己的半生不熟的解决方案。

Perl5 有一些很好的工具来处理这种事情,但我想使用纯 Raku 解决方案,这样我就可以了解更多 Raku。

有什么好的方法可以解决这个问题吗?

我试图在不知道示例的情况下回答您的问题。

您需要从A标签中提取youtubeId,然后将A标签替换成iframe标签。

伪代码为:

for each line:
   if is youtube A tag,
       youtube A tag = youtube Iframe tag

请将您的输入文件粘贴到我的输入变量中。

const input = `
text1
<a href="https://www.youtube.com/watch?v=youtubeId1">https://www.youtube.com/watch?v=youtubeId1</a>
text2
text3
<a href="https://www.youtube.com/watch?v=youtubeId2">https://www.youtube.com/watch?v=youtubeId2</a>
`;

const rx = /^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?<]*).*/;

const getYoutubeIframe = (youtubeId) => {
   return `<iframe width="560" height="315" src="https://www.youtube.com/embed/${youtubeId}?controls=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>`
}

const output = input.split('\n').map(line => {
   const youtubeLink = '<a href="https://www.youtube.com/watch?v=';
   if (line.trim().indexOf(youtubeLink) === 0) {
      const youtubeId = line.match(rx)[1];
      return getYoutubeIframe(youtubeId);
   }
   return line;
}).join('\n');

console.log(output);

好的,DOM::Tiny.

找到了这份工作我所需要的

像这样使用它:

    my $dom = DOM::Tiny.parse($html);
    for $dom.find('a[href]') -> $e  {
        if $e.text ~~ /^https\:\/\/www\.youtube\.com/ {
            my $embed = get_youtube_embed($e.text);
            $e.replace($embed)
        }
    }