2013-03-12 157 views
0

嗨,我今天的问题是使用正则表达式来解析URL。我想先将任何YouTube网址转换为嵌入视频,然后将剩余的网址(只是常规链接)转换为href链接。我已经得到了这两个工作,我的问题是,我已经得到了YouTube的网址转换后的第二个正则表达式替换了YouTube上的视频,所以我需要做的是忽略iframe标签理想。我会第一个承认我在正则表达式中非常可怕,所以我会非常感谢一些帮助,我认为对于那些有正则表达式的人来说这不会太困难。使用Youtube和非Youtube链接解析正则表达式URL

干杯, 乔丹

<script type="text/javascript"> 
function linkifyYouTubeURLs() { 

    //replaces youtubeurls with iframe 
    var re = /https?:\/\/(?:[0-9A-Z-]+\.)?(?:youtu\.be\/|youtube\.com(?:\/embed\/|\/v\/|\/watch\?v=|\/ytscreeningroom\?v=|\/feeds\/api\/videos\/|\/user\S*[^\w\-\s]|\S*[^\w\-\s]))([\w\-]{11})[?=&+%\w-]*/ig; 
    document.getElementById('CPH_Main_postContent').innerHTML = document.getElementById('CPH_Main_postContent').innerHTML.replace(re, '<br><iframe title="YouTube video player" class="youtube-player" type="text/html" width="425" height="350" src="http://www.youtube.com/embed/$1" frameborder="0"> </iframe><br>'); 

    //replaces urls with links 
    var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig; 
    document.getElementById('CPH_Main_postContent').innerHTML = document.getElementById('CPH_Main_postContent').innerHTML.replace(exp, "<a href='$1'>$1</a>"); 

} 

回答

0

你或许应该这样做,在道次和使用功能的更换:

<html> 
    <head> 
    <script type="text/javascript"> 
<!-- 
function linkifyURL (match, offset, string) 
{ 
    var re =/https?:\/\/(?:[0-9A-Z-]+\.)?(?:youtu\.be\/|youtube\.com(?:\/embed\/|\/v\/|\/watch\?v=|\/ytscreeningroom\?v=|\/feeds\/api\/videos\/|\/user\S*[^\w\-\s]|\S*[^\w\-\s]))([\w\-]{11})[?=&+%\w-]*/ig; 

    var m = re.exec (match); 
    if (m) 
    { 
     return '<br><iframe title="YouTube video player" class="youtube-player" type="text/html" width="425" height="350" src="http://www.youtube.com/embed/' + m[1] + '" frameborder="0"></iframe><br>'; 
    } 
    else return '<a href="' + match + '">' + match + '</a>'; 
} 

function linkifyYouTubeURLs() 
{ 
    var element = document.getElementById ('CPH_Main_postContent'); 

    element.innerHTML = element.innerHTML.replace (/\b(?:https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|]/ig, linkifyURL); 
} 
// --> 
    </script> 
    </head> 
    <body id="CPH_Main_postContent" onload="linkifyYouTubeURLs();"> 
    <p>This is youtube link: http://www.youtube.com/watch?v=IUcD9YIAqJE</p> 
    <p>This is normal link: http://www.google.com/</p> 
    </body> 
</html> 
+0

非常感谢Mikhail,它完美地解决了它!你是一个拯救生命的人,希望我能给你买一瓶啤酒! – 2013-03-12 06:54:35

0

如果我的理解是正确的,你的问题是第二次替换也会替换youtube链接。

为了确保只有非YouTube链路被替换,在第二正则表达式为使用负先行:

/(\b(https?|ftp|file):\/\/(?!(?:youtu\.be\/|youtube\.com).*)[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig 

负先行确保以下部分不匹配youtu.be/或YouTube .com,然后是零个或多个字符

+0

不幸的是,我没有为我工作! – 2013-03-12 06:54:11