public class TextToLinkUtil {
public static String textContainUrlToLink(String urlText) {
// 先拆分原字符串的超鏈接和文本
Spanned spanned = Html.fromHtml(urlText);
SpannableStringBuilder builder = new SpannableStringBuilder(spanned);
URLSpan[] spans = builder.getSpans(0, builder.length(), URLSpan.class);
String newUrlText = builder.toString();
ArrayList<Object> list = new ArrayList<>();
if (spans != null) {
int index = 0;
for (URLSpan urlSpan : spans) {
int start = builder.getSpanStart(urlSpan);
int end = builder.getSpanEnd(urlSpan);
if (start >= 0 && end >= 0) {
if(start <= newUrlText.length()) {
list.add(newUrlText.substring(index, start));
}
if(end <= newUrlText.length()) {
list.add(new TextUrlSpan(newUrlText.substring(start, end), urlSpan.getURL()));
}
index = end;
}
}
if(index >= 0) {
list.add(newUrlText.substring(index, newUrlText.length()));
}
} else {
list.add(newUrlText);
}
//再用正則表達式匹配文本中的鏈接吝沫,最后把超鏈接和匹配到的鏈接文本合并
// url的正則表達式
String regexp = "((http[s]{0,1})://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)"; // 結束條件
Pattern pattern = Pattern.compile(regexp, Pattern.CASE_INSENSITIVE);
String newStr = "";
for (int i = 0; i < list.size(); i++) {
if (list.get(i) instanceof String) {
String str = (String) list.get(i);
Matcher matcher = pattern.matcher(str);
String resultText = "";// (臨時變量诡宗,保存轉換后的文本)
int lastEnd = 0;// 保存每個鏈接最后一會的下標
while (matcher.find()) {
if (lastEnd >=0 && matcher.start() >=0 && matcher.start() <= str.length()) {
resultText += str.substring(lastEnd, matcher.start());
}
String url = matcher.group();
//匹配到?jīng)]有協(xié)議的鏈接,默認使用http
if(!url.startsWith("http") && !url.startsWith("https")) {
url = "http://" + url;
}
resultText += "<a href=\"" + url+ "\">" + url + "</a>";
lastEnd = matcher.end();
}
if(lastEnd >= 0) {
resultText += str.substring(lastEnd);
}
newStr += resultText;
} else if (list.get(i) instanceof TextUrlSpan) {
TextUrlSpan urlSpan = (TextUrlSpan) list.get(i);
String url = urlSpan.getURL();
//匹配到?jīng)]有協(xié)議的鏈接汽烦,默認使用http
if(!url.startsWith("http") && !url.startsWith("https")) {
url = "http://" + url;
}
newStr += "<a href=\"" + url + "\">" + urlSpan.getText() + "</a>";
}
}
return newStr;
}
private static class TextUrlSpan extends URLSpan {
private String text;
public String getText() {
return text;
}
public TextUrlSpan(String text, String url) {
super(url);
this.text = text;
}
}
}
Android將文本中的URL轉換為超鏈接工具類(原文本有超鏈接標簽也適用)
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門胯努,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牢裳,“玉大人,你說我怎么就攤上這事叶沛∑蜒叮” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵灰署,是天一觀的道長判帮。 經(jīng)常有香客問我,道長溉箕,這世上最難降的妖魔是什么晦墙? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮肴茄,結果婚禮上晌畅,老公的妹妹穿的比我還像新娘。我一直安慰自己寡痰,他們只是感情好抗楔,可當我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拦坠,像睡著了一般连躏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贞滨,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼腰池!你這毒婦竟也來了尾组?” 一聲冷哼從身側響起,我...
- 正文 年R本政府宣布橱脸,位于F島的核電站,受9級特大地震影響分苇,放射性物質發(fā)生泄漏添诉。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一组砚、第九天 我趴在偏房一處隱蔽的房頂上張望吻商。 院中可真熱鬧,春花似錦糟红、人聲如沸艾帐。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽柒爸。三九已至,卻和暖如春事扭,著一層夾襖步出監(jiān)牢的瞬間捎稚,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 嗨隅要,我知道你極度的痛苦。因為你看到了真實的自己董济。不可否認步清,真實的你真是爛極了。被拖延和懶惰鉗制虏肾。胸無大志廓啊,神情冷漠...
- 今天是旅行的最后一天了,我們要去泡溫泉封豪。早上起床后谴轮,女兒自己洗刷完畢,我們?nèi)ゲ蛷d吃早飯吹埠。女兒照顧著朋友的女兒...