【问题标题】:regular expression to add a target="blank" to all external links向所有外部链接添加 target="blank" 的正则表达式
【发布时间】:2013-04-30 12:51:54
【问题描述】:

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

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

这可能吗?如果不是,那么计算量最少的方法是什么?

【问题讨论】:

  • 您是尝试通过嵌入在 html 页面中的脚本(例如 Javascript)执行此操作,还是针对 html 文件运行程序?
  • 你想要一个正则表达式来设置一些东西吗?他们不是用来匹配字符串和模式的吗?
  • 请记住,在 HTML 中,标签属性没有严格的顺序。这样<a href="#" target="_blank"></a><a target="_blank" href="#"></a> 都是有效的。
  • @DioF:你不会从评论投票中获得代表,所以链接它很有趣(并且警告 OP 实际上不要尝试只使用正则表达式)。

标签: javascript jquery regex dom


【解决方案1】:

您并没有真正指定这是否是来自 DOM 的 html(以及其他内容)。假设你想修改 DOM... 使用 jQuery,你可以这样做:

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

这是一个 jsfiddle 显示它的工作原理(您可以检查元素以查看 hrefhttp:// 开头的 target="_blank" 具有 target="_blank"):http://jsfiddle.net/amRrj/

【讨论】:

  • 它最初的目的是作为服务器端的,以及来自 CMS 的 HTML。但是,这将被输出到一个页面,实际上我喜欢你通过 JavaScript 将计算推送到客户端的想法。
【解决方案2】:

如果 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 要插入的属性值

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

【讨论】:

    【解决方案3】:

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

        var target = '_self';
    
        if(external){
            target = '_blank';
        }
    
        $('#base_tag').attr('target', target);
    

    Fiddle

    <base> Documentation

    【讨论】:

      猜你喜欢
      • 2011-02-17
      • 1970-01-01
      • 2015-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      • 2010-10-03
      • 2010-10-01
      相关资源
      最近更新 更多