使用正则表达式简化javascript代码(获取iframes youtube的多个链接)

时间:2010-12-29 21:45:37

标签: javascript regex

您好 我有一个代码可以显示youtube视频,如果文本中有任何指向youtube的链接

例如具有多个链接

的文字

http://www.youtube.com/watch?v=-LiPMxFBLZY 测试 http://www.youtube.com/watch?v=Q3-l22b_Qg8&feature=related

示例: - pradyut.dyndns.org

这个问题有三个部分可以使用正则表达式完成..

1> 逐个获取网址以查看

2>检查他们是否是你的网址

3>将网址转换为youtube对象或iframe ...

第二个和第三个几乎完成了正则表达式..欢迎任何改进...

使用正则表达式完成代码的第一部分繁琐......

这篇文章我转发到函数......

   function to_youtubelink(text)
            {
                if ( text.indexOf ('<') > 0 || text.indexOf ('"') > 0 || text.indexOf ('>') > 0 )
                    return text;
                else
                {
                    var obj_text = new Array();
                    var oi = 0;
                    while(text.indexOf('http://') >=0)
                    { //getting the paths
                        var si = text.indexOf('http://');
                        var gr = text.indexOf('\n', si);
                        var sp = text.indexOf(' ', si);
                        var ei;
                        if ( gr > 0 || sp > 0  )
                        {
                            if ( gr >0 && sp > 0 )
                            {
                                if ( gr < sp )
                                {
                                    ei = gr ;
                                }
                                else
                                {
                                    ei = sp ;
                                }
                            }
                            else if ( gr > 0)
                            {
                                ei = gr;
                            }
                            else
                            {
                                ei = sp;
                            }
                        }
                        else
                        {
                            ei = text.length;
                        }
                        var it = text.substring(si,ei);

                        if ( it.indexOf('"') > 0)
                        {
                            it.substring(0, it.indexOf('"') );
                        }

                        if(ei < 0)
                            ei = text.length;
                        else
                            ei = text.indexOf(' ', si) ;

                        obj_text[oi] = it;

                        text = text.replace( it, '[link_service]');
                        oi++;

                    }

                    var ob_text = new Array();
                    var ob =0;
                    for (oi=0; oi<obj_text.length; oi++)
                    {
                        if ( is_youtubelink( obj_text[oi] ) )
                        {
                            ob_text[ob] = to_utubelink(obj_text[oi]);

                            ob++;
                        }
                    }
                    oi = 0;
                    while ( text.indexOf('[link_service]') >=0  )
                    {

                        text = text.replace( '[link_service]', obj_text[oi]);

                        oi ++;
                    }

                    for (ob=0; ob<ob_text.length; ob++)
                    {
                        text = text +"\n\n" + ob_text[ob];
                    }

                    return text;
                }
            }

       function is_youtubelink(text)
            {
                var matches = text.match(/http:\/\/(?:www\.)?youtube.*watch\?v=([a-zA-Z0-9\-_]+)/);
                if (matches) {
                    return true;
                } else {
                    return false;
                }

            }

            function to_utubelink(text)
            {
                var video_id = text.split('v=')[1];
                    var ampersandPosition = video_id.indexOf('&');
                    if(ampersandPosition != -1)
                    {
                        video_id = video_id.substring(0, ampersandPosition);
                    }

                    text = "<iframe title=\"YouTube video player\" class=\"youtube-player\" type=\"text/html\" width=\"425\" height=\"350\" src=\"http://www.youtube.com/embed/" + video_id + "\" frameborder=\"0\"></iframe>"
                    return text;
            }

现在我正确地得到了输出......

但我在想是否可以使用正则表达式更好地简化代码

...特别是让网址部分......

感谢

2 个答案:

答案 0 :(得分:1)

尝试这样的事情:

/**
 * Extracts a youtube id from a string
 * 
 * @param string
 *
 * @return mixed
 */

function youtubeIDextract(text) { 
    var replace = "$1";

    if (!text.match(/http:\/\/www\.youtube[^"]+/))
        return false;

    if (text.match(/^[^v]+v.([^&^=^\/]{11}).*/))
        return text.replace(/^[^v]+v.([^&^=^\/]{11}).*/,replace); 
    else if (text.match(/^[^v]+\?v=([^&^=^\/]{11}).*/))
        return text.replace(/^[^v]+\?v=([^&^=^\/]{11}).*/,replace); 
    else
        return false;
}

这里可以看到一个工作示例:http://jsfiddle.net/6PRVp/2/

如果您只想检查某处是否有youtube链接,请执行以下操作:

if (youtubeIDextract(text)) {...}

请注意,这还会检查视频ID中是否有11个字符(如果没有,则会出现格式错误的YouTube链接)。

答案 1 :(得分:0)

试试这个:

function to_youtubelink(a) {
if (a.indexOf("<") > 0 || a.indexOf('"') > 0 || a.indexOf(">") > 0) return a;
var b = Array(),
    c = 0;
while (a.indexOf("http://") >= 0) {
    var g, d = a.indexOf("http://"),
        e = a.indexOf("\n", d),
        f = a.indexOf(" ", d);
    g = e > 0 || f > 0 ? e > 0 && f > 0 ? f > e ? e : f : e > 0 ? e : f : a.length;
    var h = a.substring(d, g);
    h.indexOf('"') > 0 && h.substring(0, h.indexOf('"')), g = 0 > g ? a.length : a.indexOf(" ", d), b[c] = h, a = a.replace(h, "[link_service]"), c++
}
var i = Array(),
    j = 0;
for (c = 0; b.length > c; c++) is_youtubelink(b[c]) && (i[j] = to_utubelink(b[c]), j++);
c = 0;
while (a.indexOf("[link_service]") >= 0) a = a.replace("[link_service]", b[c]), c++;
for (j = 0; i.length > j; j++) a = a + "\n\n" + i[j];
return a
}
function is_youtubelink(a) {
var b = a.match(/http:\/\/(?:www\.)?youtube.*watch\?v=([a-zA-Z0-9\-_]+)/);
return b ? !0 : !1
}
function to_utubelink(a) {
var b = a.split("v=")[1],
    c = b.indexOf("&");
return c != -1 && (b = b.substring(0, c)), a = '<iframe title="YouTube video player" class="youtube-player" type="text/html" width="425" height="350" src="http://www.youtube.com/embed/' + b + '" frameborder="0"></iframe>'
}