用嵌入代码替换 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)
}
}
我正在用 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)
}
}