javascript - 替换文本中的随机 youtube 链接以使用 javascript 嵌入代码

标签 javascript parsing url search replace

我有一些 HTML 代码 - 例如:

<div>Text</div> 
http://www.youtube.com/watch?v=QZ2ekuCu4gM&feature=relmfu 
<div>Text</div> 
youtube.com/watch?v=adrJx864olE&feature=g-logo-xit
<div>Text</div>
<a href="#">LINK</a>

我需要用在该 URL 处嵌入视频的 iframe 自动替换任何 YouTube URL,如下所示:

<div>Text</div> 
<iframe width="560" height="315" 
src="http://www.youtube.com/embed/QZ2ekuCu4gM" frameborder="0" 
allowfullscreen></iframe>
<div>Text</div> 
<iframe width="560" height="315" 
src="http://www.youtube.com/embed/adrJx864olE" frameborder="0" 
allowfullscreen></iframe>
<div>Text</div>
<a href="#">LINK</a>

如何在 HTML 代码中搜索来自 YouTube 的链接,并使用 JavaScript 将其替换为等效的 iframe 代码?

最佳答案

这是一种实现方式:

function linkYT(el) {
    if (!el) {
        return false;
    }
    else {
        var children = el.childNodes,
            text = [];
        for (var i=0, len=children.length; i<len; i++){
            var cur = children[i],
                nType = cur.nodeType,
                content = cur.nodeValue,
                url = 'http://www.youtube.com/embed/';
            if (nType == 3 && content.indexOf('youtube.com') > -1) {
                var embed = content.trim().match(/v=(\w+)/)[1],
                    iframe = document.createElement('iframe');
                iframe.src = url + embed;
                el.insertBefore(iframe, cur.nextSibling);
                cur.parentNode.removeChild(cur);
            }
        }
    }
}

var el = document.getElementById('content');
linkYT(el);​

JS Fiddle demo .

请注意,根本没有完整性检查,并且这种方法要求视频标识符以 v= 开头,并且以非字母数字字符结尾。

我只在 Opera 12 和 Chromium 19 中进行了测试和验证。

考虑到 一种 其他形式的 YouTube URL 格式:

function createIframe(embed, parent, after, url){
    if (!embed || !parent || !after) {
        return false;
    }
    else {
        url = url ? url : 'http://www.youtube.com/embed/';
        var iframe = document.createElement('iframe');
        iframe.src = url + embed;
        parent.insertBefore(iframe, after.nextSibling);
        parent.removeChild(after);
    }
}

function linkYT(el) {
    if (!el) {
        return false;
    }
    else {
        var children = el.childNodes,
            text = [];
        for (var i=0, len=children.length; i<len; i++){
            var cur = children[i],
                nType = cur.nodeType,
                content = cur.nodeValue,
                url = 'http://www.youtube.com/embed/';
            if (nType == 3) {
                if (content.indexOf('youtube.com') > -1) {
                    var embed = content.trim().match(/v=(\w+)/)[1];
                    createIframe(embed, el, cur);
                }
                else if (content.indexOf('youtu.be') > -1) {
                    var embed = content.trim().match(/be\/(\w+)/)[1];
                    createIframe(embed, el, cur);
                }
            }
        }
    }
}

var el = document.getElementById('content');
linkYT(el);​

JS Fiddle demo .

实际上这是相同的过程,只是正则表达式略有不同。

因为有两个地方 nodeType 必须等于 3 两个地方 iframe 正在创建,我将两个 indexOf() 评估包装在 if 中以测试 nodeType 和抽象的 iframe - 创建一个单独的函数,两者都只是为了避免不必要的重复。

引用资料:

关于javascript - 替换文本中的随机 youtube 链接以使用 javascript 嵌入代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11621275/

相关文章:

parsing - 解析器/词法分析器忽略不完整的语法规则

parsing - 获取有关 Groovy 函数的信息(名称、签名、主体代码)

url - Apple Store URL 在应用程序批准之前可用吗?

python - 使用 URL 路径或查询参数进行分页

javascript - window.open 无法正常工作,解析 URL 被 chop

javascript - 模拟 REST API 和假域名

javascript - 如何使我的 CRUD 应用程序离线工作?

javascript - 在 mongo 和 Node 的大集合上迭代游标不返回所有结果?

javascript - 带有动态变量的正则表达式不起作用

java - 任何用于 Java 的 RFC 2397 数据 URI 解析器?