0

嗨,我今天的问题是使用正则表达式来解析 url。我想首先将任何 youtube url 转换为嵌入式视频,然后将剩余的 url(只是常规链接)转换为 href 链接。我已经让这两个工作正常了,我的问题是在我转换了 youtube url 之后,第二个正则表达式替换会弄乱 youtube 视频,所以我需要做的是理想地忽略 iframe 标签。我将是第一个承认我在正则表达式方面很糟糕的人,所以我真的很感激一点帮助,我认为对于一个半正则表达式的人来说,这不会太难。

干杯,乔丹

<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>"); 

}

4

2 回答 2

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>
于 2013-03-12T06:30:11.720 回答
0

如果我的理解是正确的,那么您的问题是第二次替换也替换了 youtube 链接。

为确保仅替换非 youtube 链接,请在第二个正则表达式中使用负前瞻:

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

负前瞻确保以下部分不匹配 youtu.be/ 或 youtube.com 后跟零个或多个字符

于 2013-03-12T06:30:26.003 回答