正则表达式为所有外部链接添加target="blank"属性

4

3
你是想从嵌入在HTML页面中的脚本(例如Javascript)来执行这个操作,还是在对一个HTML文件运行程序? - Liv
你想要一个正则表达式来设置什么吗?它们不是用来匹配模式字符串的吗? - engma
2
一个用于解析(和修改)HTML的正则表达式? - ssube
请注意,在HTML中,标签属性的顺序并不严格。因此,<a href="#" target="_blank"></a><a target="_blank" href="#"></a>都是有效的。 - Alessandro Vendruscolo
@peachykeen:普通人,别再粘贴这个链接了。我想每个人都已经看过了,仅仅通过链接来获得声誉有点不公平...虽然很有趣。 - Dio F
1
@DioF:你不会通过评论投票获得声望,因此链接它只是好玩(并且是对OP的警告,不要尝试仅使用正则表达式)。 - ssube
4个回答

3

您并没有明确指定这将是来自DOM的html(除其他事项外)。假设您想要修改DOM...使用jQuery,您可以执行以下操作:

$(document).ready( function() {
    $('a').filter( function() {
        return $(this).attr('href').substr(0, 7) == "http://";
    }).attr('target', '_blank');
});

这里有一个 jsfiddle,展示了它是如何工作的(您可以检查元素,看到以“http://”开头的a标签具有target="_blank"): http://jsfiddle.net/amRrj/

最初的设想是作为服务器端,并从CMS生成HTML。然而,现在将其输出到页面上,并且我喜欢您推送计算到客户端的JavaScript 的想法。 - Karl Cassar

1
如果HTML也是格式良好的XML,则最好使用支持xpath和xslt的XML工具。请查看XMLStarlet,它提供了类似于grep、sed等用于处理XML的工具。我认为这可以实现您想要的功能,但我还没有尝试过。
xml ed -P -S -i //a -t attr -n target -v _blank somefile.html >somefile_2.html

xml ed 调用 XMLStarlet 编辑命令

-P 保留格式

-S 保留空格

-i //a 在每个标签处插入

-t attr 插入类型为属性

-n target 要插入的属性名称

-v _blank 要插入的属性值

对于更复杂的编辑,您可以使用 XMLStarlet 和 xslt 转换。


0

另一个选项是在<base href... >中添加target="_blank"。这将全局影响页面的<a>标签目标,而不需要单独添加它们。对<a>标签的目标声明将覆盖此设置。

    var target = '_self';

    if(external){
        target = '_blank';
    }

    $('#base_tag').attr('target', target);

Fiddle

<base> 文档


0
我写了这个或许可以帮到你:
正则表达式:/<a(.*?)href="(.*?)"(.*?)>(.*?)<\/a>/gi

console.log(`<a href="https://www.stackoverflow.com/test" target="_parent">Stackoverflow</a>`.replace(/<a(.*?)href="(.*?)"(.*?)>(.*?)<\/a>/gi, '<a href="$2" target="_blank">$4</a>'));
console.log(`<a href="https://www.stackoverflow.com/test" target="_target">Stackoverflow</a>`.replace(/<a(.*?)href="(.*?)"(.*?)>(.*?)<\/a>/gi, '<a href="$2" target="_blank">$4</a>'));
console.log(`<a href="https://www.stackoverflow.com/test">Stackoverflow</a>`.replace(/<a(.*?)href="(.*?)"(.*?)>(.*?)<\/a>/gi, '<a href="$2" target="_blank">$4</a>'));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接