在javascript中使用正则表达式解析多个youtube链接到对象或iframe

时间:2010-12-29 06:17:03

标签: javascript regex

我想解析文本中嵌入对象的多个youtube链接。

例如,在文本中:

This is a test another testing I'm writing this...
http://www.youtube.com/watch?v=-LiPMxFBLZY This is a test another testing I'm writing this...
http://www.youtube.com/watch?v=Q3-l22b_Qg8&feature=related another test

现在,链接将转换为iframe,结果文本为:

This is a test another testing I'm writing this...
<iframe title="YouTube video player" class="youtube-player" type="text/html" width="425" height="350" src="http://www.youtube.com/embed/-LiPMxFBLZY" frameborder="0"> </iframe> This is a test another testing i m writing this...
<iframe title="YouTube video player" class="youtube-player" type="text/html" width="425" height="350" src="http://www.youtube.com/embed/Q3-l22b_Qg8" frameborder="0"></iframe> another test

然后必须使用此代码发送文本以链接任何其他链接...

function text_to_link(inputText) {
    var object_text = new Array();
    var oi = 0;

    while (inputText.indexOf('<object') >= 0) {
        var si = inputText.indexOf('<object');
        var ei = inputText.indexOf('</object>');
        object_text[oi] = inputText.substring(si, ei + 9);

        inputText = inputText.replace(object_text[oi], '[ob_service]');
        oi++;
    }

    var iframe_text = new Array();
    var ii = 0;
    while (inputText.indexOf('<iframe') >= 0) {
        var si = inputText.indexOf('<iframe');
        var ei = inputText.indexOf('</iframe>');
        iframe_text[ii] = inputText.substring(si, ei + 9);

        inputText = inputText.replace(iframe_text[ii], '[if_service]');
        ii++;
    }

    var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
    inputText = inputText.replace(exp, "<a href='$1' target='_blank'>$1</a>");

    oi = 0;
    while (inputText.indexOf('[ob_service]') >= 0) {
        inputText = inputText.replace('[ob_service]', object_text[oi]);
        oi++;
    }

    ii = 0;
    while (inputText.indexOf('[if_service]') >= 0) {
        inputText = inputText.replace('[if_service]', iframe_text[ii]);
        ii++;
    }

    return inputText;

}

请帮我找一个更简单的正则表达式解决方案......

1 个答案:

答案 0 :(得分:0)

基本上,您希望匹配以“http,https,文件或文件”开头的链接。 但您不希望匹配可能出现在iframe或对象标记内的链接,也不希望匹配这两个先前标记的属性。

不幸的是,您已达到Javascript正则表达式的限制。 要解决您的问题,您需要一个好的HTML解析器。

顺便说一句,你可以重构你的代码。链接替换之前和之后的循环可以放在函数中。