正则表达式将target =“blank”添加到所有外部链接

时间:2013-04-30 12:51:54

标签: javascript jquery regex dom

是否可以只使用一个正则表达式向所有target="_blank"个标签添加<a>?我一直在尝试消极和积极的前瞻/后视,但无济于事。这应该:

  • 匹配hrefhttp://
  • 开头的锚标记
  • 如果锚标记没有target标记,则添加target="_blank"标记
  • 如果它有target标记,则会检查target标记是否尚未设置为"_blank",如果没有,则会将其替换为target="_blank"

这可能吗?如果不是,那么计算密集度最低的方法是什么?

3 个答案:

答案 0 :(得分:3)

你没有真正指定这是否是来自DOM的html(以及其他内容)。假设您要修改DOM ...使用jQuery,您可以执行以下操作:

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

这是一个显示它有用的jsfiddle(你可以检查元素,看看ahref开头的http://target="_blank"): http://jsfiddle.net/amRrj/

答案 1 :(得分: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转换一起使用。

答案 2 :(得分:0)

另一个选择是将target="_blank"添加到<base href…>。这将全局影响页面<a>标记目标,而不是需要单独添加它们。 <a>标记上的目标声明将覆盖此标记。

    var target = '_self';

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

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

Fiddle

<base> Documentation