2013-10-14 186 views
-1

我正在使用java。我有一個文本,在這個文本中有幾個鏈接。其中一些鏈接到特定的網站,這些鏈接不會改變。其餘的不是,我想通過鏈接替換這些鏈接。 我曾經replaceAll()法:替換文本中的特定鏈接

String input = "my text"; 
String regex = "<a href=\"[^\"]+\">[^<]+</a>"; 
String output = input.replaceAll(regex, "<a href=\"myweb.com\">my web</a>"); 

但它取代了我的文字的各個環節,我不知道怎麼問,它只是取代了一些鏈接。 我該如何做我的目的?謝謝 更新: input只是一篇文章中的內容和很少的聯繫。

+0

你的正則表達式是不知道什麼應該由'myweb.com'更換所以你必須將它添加到它。 – A4L

+0

給我們一個正確的輸入文字在你的問題 – SSP

+0

應該有一些東西在你不想要替換的URL中是常見的 – SSP

回答

1

隨着

<a href=\"[^\"]+\">[^<]+</a> 

這是不可能的,因爲[^\"]+將匹配任何charachter這不是一個"

你可以試試下面的正則表達式

<a href=\".*(foo\\.com|bar\\.org).*\">[^<]+</a> 

有了這個樣本文字

static String input = "my text\r\n" + 
     "Foo foo foo\r\n" + 
     "<a href=\"foo.com\">Foo site</a>\r\n" + 
     "Bar bar bar\r\n" + 
     "<a href=\"bar.org\">Bar site</a>\r\n" + 
     "bla bla bla\r\n" + 
     "\r\n" + 
     ""; 

這裏是一個小測試:

@Test 
public void replaceLinks() { 
    String regex = "<a href=\".*(foo\\.com|bar\\.org).*\">[^<]+</a>"; 
    String output = input.replaceAll(regex, "<a href=\"myweb.com\">my web</a>"); 
    System.out.println(output); 
} 

輸出是:

my text 
Foo foo foo 
<a href="myweb.com">my web</a> 
Bar bar bar 
<a href="myweb.com">my web</a> 
bla bla bla 

然而,由於您的輸入似乎是一個HTML fragement的正確方法是用HTML解析它解析器,如JSoup,並獲取所有鏈接,然後將模式應用於href屬性。如果匹配,則通過將新鏈接設置到元素中進行替換。

完成後寫入片段bak。

@Test 
public void replaceLinksJSoup() { 
    Document doc = Jsoup.parse(input); 
    Elements links = doc.getElementsByTag("a"); 
    Pattern pattern = Pattern.compile(".*(foo\\.com|bar\\.org).*"); 
    for (Element link : links) { 
     String linkHref = link.attr("href"); 
     if (pattern.matcher(linkHref).matches()) { 
      link.attr("href", "myweb.com"); 
      link.text("my web"); 
     } 
    } 
    System.out.println(doc.body().html()); 
} 

輸出:

my text Foo foo foo 
<a href="myweb.com">my web</a> Bar bar bar 
<a href="myweb.com">my web</a> bla bla bla