javascript 字串自動添加 URL/EMAIL 連結 By shawl.qiu
說明:
其實關於自動附加 URL/EMAIL 連結我至少寫了不少於十個這樣功能的代碼了.
直到最近學JS小成, 弄了一個比較完美的DOM解決方案, 倒是可以無誤附加連結.
但是問題總是會出現的, 雖然用DOM方法可以無誤附加連結, 但是卻把縮排格式給丟了....
這個是致命的, 所以就重寫了一個不會丟失縮排的囉.
這個是直接進行字串處理的, 應該有可能發生錯誤, 但是出錯率會相當低.
目錄:
1. DOM 附加 URL/EMAIL 連結
2. 字串附加 URL/EMAIL 連結
shawl.qiu
2006-12-13
http://blog.csdn.net/btbtd
1. DOM 附加 URL/EMAIL 連結
- <script type="text/javascript">
- //<![CDATA[
- onload=function(){
- var o_=document;
- fDomAtcLink(o_.body, o_);
- }
- //sqMethod.attachlink(o_.body, o_)
- function fDomAtcLink(obj, dcu){
- var temp, str='', span;
- for(var i=0, j=obj.childNodes.length; i<j; i++){
- temp=obj.childNodes[i];
- if(temp.nodeType==3){
- if(temp.parentNode.nodeName=='A')return false;
- if(temp.data.indexOf('http')<0&&temp.data.indexOf('ftp')<0&&
- temp.data.indexOf('@')<0)continue;
- span=dcu.createElement('span');
- str=temp.data.replace(//&/g,'&').replace(/</g,'<').replace(/>/g,'>');
- //str=sqMethod.encode(temp.data);
- str=str.replace(/(ht|f)tp(s|)/:////[/-/w.:]+(//[^ /n/r/'/"]+|)/gi,function(match){
- return '<a href="'+match+'" class="sqUrl">'+match+'</a>'; } );
- str=str.replace(/[/w.]+@[/w/-.]+(//[^ /n/r/'/"]+|)/gi,function(match){
- return '<a href="mailto:'+match+'" class="sqMail">'+match+'</a>'; } );
- span.innerHTML=str;
- obj.replaceChild(span, temp);
- }
- if(temp.nodeType==1)arguments.callee(obj.childNodes[i], dcu);
- } temp=span=null; // shawl.qiu script
- }
- //]]>
- </script>
2. 字串附加 URL/EMAIL 連結
- <script type="text/javascript">
- //<![CDATA[
- onload=function(){
- var html=document.body.innerHTML;
- document.body.innerHTML=fPadUrl(document.body.innerHTML);
- document.body.innerHTML=fPadEmail(document.body.innerHTML);
- }
- function fPadUrl(str){
- if(!str||str.replace(//s+/,'').length<0)return false;
- var re=new RegExp('([//s//S]|)((ht|f)t(p|ps)/:////.*?)(//s|/ /;|/>/;|/</;|'+
- '[/'/"<>]|/&/#34/;)','gi');
- return str.replace(re,
- function($1,$2,$3,$4,$5,$6){
- if(//'|/"|/=|/= /.test($2))return $1;
- $3='<a href="'+$3+'" class="sqLink">'+$3+'</a>';
- return $2+$3+$6;
- }
- ); // shawl.qiu script
- }
- function fPadEmail(str){
- if(!str||str.replace(//s+/,'').length<0)return false;
- var re=new RegExp('(mailto/:|/>|)([//w/./-]+)/@(.*?)'+
- '(//s|/ /;|/>/;|/</;|[/'/"<>]|/&/#34/;)','gi');
- return str.replace(re,
- function($1,$2,$3,$4,$5){
- if(/mailto|>/.test($2))return $1;
- $3='<a href="mailto:'+$3+'@'+$4+'" class="sqLink">'+$3+'@'+$4+'</a>';
- return $2+$3+$5;
- }
- ); // shawl.qiu script
- }
- //]]>
- </script>