簡體   English   中英

向所有外部鏈接添加 target="blank" 的正則表達式

[英]regular expression to add a target="blank" to all external links

是否可以僅使用一個正則表達式將target="_blank"添加到所有<a>標記? 我一直在嘗試消極和積極的前瞻/后視,但無濟於事。 這應該:

  • 匹配hrefhttp://開頭的錨標簽
  • 如果錨標簽沒有target標簽,則添加一個target="_blank"標簽
  • 如果它確實有target標簽,它會檢查target標簽是否尚未設置為"_blank" ,如果沒有,則將其替換為target="_blank"

這可能嗎? 如果不是,那么計算密集度最低的方法是什么?

你沒有真正指定這是否是來自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/

如果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每個標簽-i //a插入

-t attr insert type是屬性

-n target要插入的屬性的-n target名稱

-v _blank要插入的屬性值

對於更復雜的編輯,您可以將XMLStarlet與xslt轉換一起使用。

另一個選擇是將target="_blank"<base href…> 這將全局影響頁面<a>標記目標,而不是需要單獨添加它們。 <a>標簽上的目標聲明將覆蓋此。

    var target = '_self';

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

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

小提琴

<base>文檔

我寫這個也許有幫助:

正則表達式:/<a(.*?)href="(.*?)"(.*?)>(.*?)<\/a>/ /<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>'));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM