最近作的一個項目中遇到使用正則匹配一段文本中的 url 並將其顯示爲短鏈接的需求。php
顯示的文本包括爲防止 xss 而用 js 處理過的帶有特殊符號的文本以及 php 直接渲染後的文本,因此須要兩個正則表達式。正則表達式
// 匹配不帶特殊符號的文本的正則 var reg0 = /((((https?|ftp?):(?:\/\/)?)(?:[-;:&=\+\$]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\?\+=&;:%!\/@.\w_]*)#?(?:[-\+=&;%!\?\/@.\w_]*))?)/ig; // 匹配帶有特殊符號的文本的正則 var reg1 = /((((https?|ftp?|http?):(?:(/)(/))?)(?:[-;:(&)=\+\$]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:=\+\$]+@)[A-Za-z0-9.-]+)((?:(/)[\+~%(/).\w-_]*)?\??(?:[-\?\+=(&);:%!(/)@.\w_]*)#?(?:[-\?\+=(&);%!(/)@.\w_]*))?)/ig; function replaceSrc(txt, type){ // 將長鏈接處理爲短連接 var urlReg = /[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?/; // type 爲 0 表示文本中不帶有特殊符號 if( type == '0' ){ reg = reg0; // type 爲 1 表示文本經js處理過,帶有特殊符號 }else if( type == '1' ){ reg = reg1; } var result = txt.replace(reg,function(item){ return "<a class='short_link' href='"+ item +"' target='_blank'>"+urlReg.exec(item)[0]+"</a>"; }); return result; }