Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将URL转换为链接,除非已经存在链接_Javascript_Regex - Fatal编程技术网

Javascript 将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+&@#\/%?=~_|!:,.;]*[-

我知道这里已经谈到了这一点,但没有为确切的问题提供解决方案。请看一看

我正在使用一个函数将纯文本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>
看起来像:

它可以工作,但也可以用嵌套链接替换现有的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:也去掉了字符。

使用,这看起来像(演示在):

编辑:排除文本区域、脚本和嵌入式CSS。我注意到这也可以通过使用来完成,它的优点是不添加额外的span元素

编辑2:删除了所有的符号和双引号


编辑3:也删除了字符。

很好!但我在Blogger中使用了此功能,Blogger与ampersands之间存在问题。Blogger会自动将所有引号替换为“因此我尝试替换”&;(在没有jQuery的情况下工作得很好),但现在不起作用(什么都没有发生)。我也试过删除符号,但都不起作用。总之,多亏了你,我学到了一些有趣的东西。也许这个脚本也应该排除img标签…@Matias:如果你认为这是个问题,我已经编辑了这个脚本,删除了所有的符号和双引号。看起来Blogger用$(“”)替换了$(“”)。谢谢你的时间和耐心,但我输了。博主不接受没有引用的A标签。Blogger说:«与元素类型“href”»相关联的属性“{1}”需要打开引号。»卓越!但我在Blogger中使用了这个,Blogger与ampersands有一个问题。Blogger会自动将所有引用替换为“所以我尝试将”&“替换为&;(这在没有jQuery的情况下运行良好),但现在不起作用(什么都没有发生)。我也尝试过删除符号,但都不起作用。无论如何,多亏了你,我学到了一些有趣的东西。也许脚本也应该排除img标记…@Matias:如果你认为这是个问题,我已经编辑了脚本以消除所有的符号和双引号。看起来Blogger用$(“”)替换了$(“”)。感谢您的时间和耐心,但我已经失去了。Blogger不接受没有引号的A标记。Blogger说:«与元素类型“href”关联的属性“{1}”需要打开引号。»
<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);