JAVA代碼javascript
項目的一個需求,給用戶提交的內容中的網址添加上連接,PC端用的是jsp,因此用了taglib,用起來更加方便,關鍵代碼:java
Pattern p = Pattern.compile("(https?://|www\\.)[a-zA-Z_0-9\\-@]+(\\.\\w[a-zA-Z_0-9\\-:]+)+(/[()~#&\\-=?\\+\\%/\\.\\w]+)?"); Matcher m = p.matcher(content); StringBuffer sb = new StringBuffer(); while (m.find()) { String url = m.group(); String href = url; if (!url.startsWith("http") && !url.startsWith("https")) { href = "http://" + url; } m.appendReplacement(sb, "<a target=\"_blank\" href=\"" + href + "\">" + url + "</a>"); } m.appendTail(sb);
其中content是傳進來的參數。Matcher類的appendReplacement方法的做用是將當前匹配子串替換爲指定字符串,而且將替換後的子串以及其以前到上次匹配子串以後的字符串段添加到一個 StringBuffer 對象裏,再用appendTail方法將最後剩餘的內容添加到sb對象中,獲得一個所有替換後的字符串。react
JS代碼app
項目的移動端用的是reactjs,客戶端渲染,因此採用了js來替換內容,關鍵代碼:jsp
var convertUrl = function(content) { if (!content) { return ""; } let urlPattern = /(https?:\/\/|www\.)[a-zA-Z_0-9\-@]+(\.\w[a-zA-Z_0-9\-:]+)+(\/[\(\)~#&\-=?\+\%/\.\w]+)?/g; content = content.replace(urlPattern, function (match) { var href = match; if (match.indexOf("http") == -1) { href = "http://" + match; } return "<a target=\"_blank\" href=\"" + href + "\">" + match + "</a>"; }); return content; }
js裏面用了replace方法,可是第二個參數沒有用要替換的字符串,而是用了一個方法,方法的參數是匹配到的子串,在global模式下逐個替換。url
不多用到replace方法第二個參數是方法的,用法參考mdn的String.prototype.replace() 。prototype