Javascript 将URL转换为链接,除非已经存在链接
我知道这里已经谈到了这一点,但没有为确切的问题提供解决方案。请看一看 我正在使用一个函数将纯文本URL转换为可单击的链接。这就是我所拥有的:Javascript 将URL转换为链接,除非已经存在链接,javascript,regex,Javascript,Regex,我知道这里已经谈到了这一点,但没有为确切的问题提供解决方案。请看一看 我正在使用一个函数将纯文本URL转换为可单击的链接。这就是我所拥有的: <script type='text/javascript' language='javascript'> window.onload = autolink; function autolink(text) { var exp = /(\b(https?|ftp):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-
<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>
看起来像:
它可以工作,但也可以用嵌套链接替换现有的HTML链接
因此,一个有效的HTML链接
<a href="https://stackoverflow.com/">StackOverflow</a>
变得很混乱,比如:
<a href="https://stackoverflow.com/<a href="https://stackoverflow.com/">StackOverflow</a>">StackOverflow</a>...
堆栈溢出。。。
如何修复表达式以忽略链接标记的内容?谢谢
我是一个新手…我几乎不懂正则表达式的代码。请温柔一点:)再次感谢。这个问题超出了正则表达式的能力。你可能可以编写一个正则表达式来避免某些链接,但你不可能避免所有现有的链接 好消息是,另一种方法将使这项工作变得更容易。现在,您可以使用
document.body.innerHTML
将HTML作为纯文本进行操作。要正确操作,您基本上需要自己解析HTML。但您不必,,因为浏览器已经为您解析了它!
web浏览器允许您以一系列对象的形式访问HTML文档。它被称为文档对象模型(DOM)如果您阅读了一些相关内容,您应该能够学习如何遍历HTML,跳过
A
元素中的任何内容,并仅在纯文本中使用正则表达式。这个问题超出了正则表达式的能力。您可能能够编写一个正则表达式,可以避免某些链接,但您不会能够避免每一个现有的环节
好消息是,另一种方法将使这项工作变得更容易。现在,您可以使用document.body.innerHTML
将HTML作为纯文本进行操作。要正确操作,您基本上需要自己解析HTML。但您不必,,因为浏览器已经为您解析了它!
web浏览器允许您以一系列对象的形式访问HTML文档。它被称为文档对象模型(DOM)如果您对此做了一些阅读,您应该能够学习如何遍历HTML,跳过A
元素中的任何内容,并仅使用纯文本上的正则表达式。使用,这看起来像(演示):
编辑:排除文本区域、脚本和嵌入式CSS。我注意到这也可以通过使用来完成,它的优点是不添加额外的span元素
编辑2:删除了所有的符号和双引号
编辑3:也去掉了编辑3:也删除了
<a href="https://stackoverflow.com/<a href="https://stackoverflow.com/">StackOverflow</a>">StackOverflow</a>...
function autolink() {
var exp = /(\b(https?|ftp):\/\/[-A-Z0-9+\u0026@#\/%?=~_|!:,.;]*[-A-Z0-9+\u0026@#\/%=~_|])/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);