2010-10-17 84 views
1

我知道这里已经讨论过这个问题,但没有解决方案提供给确切的问题。请看看...将URL转换为链接,除非已经存在链接

我正在使用函数将纯文本URL转换为可点击的链接。这是我有:

<script type='text/javascript' language='javascript'> 

window.onload = autolink; 

function autolink(text) { 

var exp = /(\b(https?|ftp):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gim; 

document.body.innerHTML = document.body.innerHTML.replace(exp,"<a href='$1'>$1</a>"); 

} 

</script> 

这使得

https://stackoverflow.com/ 

的样子:

https://stackoverflow.com/

它的工作原理,而且还更换嵌套链接存在的HTML链接。

因此,像

<a href="https://stackoverflow.com/">StackOverflow</a> 

有效的HTML链接变得像一些凌乱:

<a href="https://stackoverflow.com/<a href="https://stackoverflow.com/">StackOverflow</a>">StackOverflow</a>... 

如何解决忽略链接标签的内容表达?谢谢!

我是一个新手......我几乎没有理解正则表达式的代码。请温柔:)再次感谢。

回答

3

此问题超出了正则表达式的威力。你可能会写一个可以避免某些链接的正则表达式,但是你无法避免每一个现有的链接。

好消息是,不同的方法将使工作更容易。现在你使用document.body.innerHTML来操作纯文本的HTML。要做到这一点正确,你基本上需要自己解析HTML。但是你不必,因为浏览器已经为你解析它!

Web浏览器允许您以一系列对象的形式访问HTML文档。它被称为文档对象模型(DOM),如果您对此有所了解,您应该能够学习如何遍历HTML,跳过A元素中的任何内容,并使用纯文本的正则表达式只要。

+0

谢谢!我会尽力。 – Matias 2010-10-17 23:36:53

5

使用jQuery JavaScript library,这看起来像(在http://jsfiddle.net/BRPRH/4演示):

function autolink() { 
    var exp = /(\b(https?|ftp):\/\/[-A-Z0-9+\[email protected]#\/%?=~_|!:,.;]*[-A-Z0-9+\[email protected]#\/%=~_|])/gi, 
     lt = '\u003c', 
     gt = '\u003e'; 

    $('*:not(a, script, style, textarea)').contents().each(function() { 
     if (this.nodeType == Node.TEXT_NODE) { 
      var textNode = $(this); 
      var span = $(lt + 'span/' + gt).text(this.nodeValue); 
      span.html(span.html().replace(exp, lt + 'a href=\'$1\'' + gt + '$1' + lt + '/a' + gt)); 
      textNode.replaceWith(span); 
     } 
    }); 
} 

$(autolink); 

编辑:排除文字区域,脚本和内嵌CSS。我注意到,这也可以使用pure DOM's splitText来完成,其优点是不添加额外的span元素。

编辑2:消除所有&符号和双引号。

编辑3:摆脱了<和>字符。

+0

优秀!但是,我在Blogger中使用此功能,并且Blogger有&符号问题。Blogger自动将所有引号替换为",所以我试图用&(它在没有jQuery的情况下运行良好)替换“&”,但现在不起作用(没有任何反应)。我试图删除&符号,但都无效。 – Matias 2010-10-17 23:31:57

+0

无论如何,感谢你,我学到了一些有趣的东西。也许脚本也应该排除img标签以及... – Matias 2010-10-17 23:36:11

+0

@Matias:如果您认为这是一个问题,我编辑了脚本以消除所有&符号和双引号。 – PleaseStand 2010-10-17 23:43:58

相关问题