Advertisement
mokeev1995

find and replace url in string

Jun 30th, 2014
2,021
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //------------------------------------------------------------------------------
  2. //-----------------------------findAndReplaceLink-------------------------------
  3. //------------------------------------------------------------------------------
  4.  
  5. function findAndReplaceLink(inputText) {
  6.     function indexOf(arr, value, from) {
  7.         for (var i = from || 0, l = (arr || []).length; i < l; i++) {
  8.             if (arr[i] == value) return i;
  9.         }
  10.         return -1;
  11.     }
  12.  
  13.     function clean(str) {
  14.         return str ? str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#039;') : '';
  15.     }
  16.  
  17.     function replaceEntities(str) {
  18.         return se('<textarea>' + ((str || '').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;')) + '</textarea>').value;
  19.     }
  20.     function se(html) {return ce('div', {innerHTML: html}).firstChild;}
  21.     function ce(tagName, attr, style) {
  22.         var el = document.createElement(tagName);
  23.         if (attr) extend(el, attr);
  24.         if (style) setStyle(el, style);
  25.         return el;
  26.     }
  27.     function setStyle(elem, name, value){
  28.         elem = ge(elem);
  29.         if (!elem) return;
  30.         if (typeof name == 'object') return each(name, function(k, v) { setStyle(elem,k,v); });
  31.         if (name == 'opacity') {
  32.             if (browser.msie) {
  33.                 if ((value + '').length) {
  34.                     if (value !== 1) {
  35.                         elem.style.filter = 'alpha(opacity=' + value * 100 + ')';
  36.                     } else {
  37.                         elem.style.filter = '';
  38.                     }
  39.                 } else {
  40.                     elem.style.cssText = elem.style.cssText.replace(/filter\s*:[^;]*/gi, '');
  41.                 }
  42.                 elem.style.zoom = 1;
  43.             };
  44.             elem.style.opacity = value;
  45.         } else {
  46.             try{
  47.                 var isN = typeof(value) == 'number';
  48.                 if (isN && (/height|width/i).test(name)) value = Math.abs(value);
  49.                 elem.style[name] = isN && !(/z-?index|font-?weight|opacity|zoom|line-?height/i).test(name) ? value + 'px' : value;
  50.             } catch(e){debugLog('setStyle error: ', [name, value], e);}
  51.         }
  52.     }
  53.     function extend() {
  54.         var a = arguments, target = a[0] || {}, i = 1, l = a.length, deep = false, options;
  55.  
  56.         if (typeof target === 'boolean') {
  57.             deep = target;
  58.             target = a[1] || {};
  59.             i = 2;
  60.         }
  61.  
  62.         if (typeof target !== 'object' && !isFunction(target)) target = {};
  63.  
  64.         for (; i < l; ++i) {
  65.             if ((options = a[i]) != null) {
  66.                 for (var name in options) {
  67.                     var src = target[name], copy = options[name];
  68.  
  69.                     if (target === copy) continue;
  70.  
  71.                     if (deep && copy && typeof copy === 'object' && !copy.nodeType) {
  72.                         target[name] = extend(deep, src || (copy.length != null ? [] : {}), copy);
  73.                     } else if (copy !== undefined) {
  74.                         target[name] = copy;
  75.                     }
  76.                 }
  77.             }
  78.         }
  79.  
  80.         return target;
  81.     }
  82.  
  83.     var replacedText = (inputText || '').replace(/(^|[^A-Za-z0-9А-Яа-яёЁ\-\_])(https?:\/\/)?((?:[A-Za-z\$0-9А-Яа-яёЁ](?:[A-Za-z\$0-9\-\_А-Яа-яёЁ]*[A-Za-z\$0-9А-Яа-яёЁ])?\.){1,5}[A-Za-z\$рфуконлайнстРФУКОНЛАЙНСТ\-\d]{2,22}(?::\d{2,5})?)((?:\/(?:(?:\&amp;|\&#33;|,[_%]|[A-Za-z0-9А-Яа-яёЁ\-\_#%?+\/\$.~=;:]+|\[[A-Za-z0-9А-Яа-яёЁ\-\_#%?+\/\$.,~=;:]*\]|\([A-Za-z0-9А-Яа-яёЁ\-\_#%?+\/\$.,~=;:]*\))*(?:,[_%]|[A-Za-z0-9А-Яа-яёЁ\-\_#%?+\/\$.~=;:]*[A-Za-z0-9А-Яа-яёЁ\_#%?+\/\$~=]|\[[A-Za-z0-9А-Яа-яёЁ\-\_#%?+\/\$.,~=;:]*\]|\([A-Za-z0-9А-Яа-яёЁ\-\_#%?+\/\$.,~=;:]*\)))?)?)/ig,
  84.             function () { // copied to notifier.js:3401
  85.                 var matches = Array.prototype.slice.apply(arguments),
  86.                     prefix = matches[1] || '',
  87.                     protocol = matches[2] || 'http://',
  88.                     domain = matches[3] || '',
  89.                     url = domain + (matches[4] || ''),
  90.                     full = (matches[2] || '') + matches[3] + matches[4];
  91.  
  92.                 if (domain.indexOf('.') == -1 || domain.indexOf('..') != -1) return matches[0];
  93.                 var topDomain = domain.split('.').pop();
  94.                 if (topDomain.length > 6 || indexOf('info,name,aero,arpa,coop,museum,mobi,travel,xxx,asia,biz,com,net,org,gov,mil,edu,int,tel,ac,ad,ae,af,ag,ai,al,am,an,ao,aq,ar,as,at,au,aw,ax,az,ba,bb,bd,be,bf,bg,bh,bi,bj,bm,bn,bo,br,bs,bt,bv,bw,by,bz,ca,cc,cd,cf,cg,ch,ci,ck,cl,cm,cn,co,cr,cu,cv,cx,cy,cz,de,dj,dk,dm,do,dz,ec,ee,eg,eh,er,es,et,eu,fi,fj,fk,fm,fo,fr,ga,gd,ge,gf,gg,gh,gi,gl,gm,gn,gp,gq,gr,gs,gt,gu,gw,gy,hk,hm,hn,hr,ht,hu,id,ie,il,im,in,io,iq,ir,is,it,je,jm,jo,jp,ke,kg,kh,ki,km,kn,kp,kr,kw,ky,kz,la,lb,lc,li,lk,lr,ls,lt,lu,lv,ly,ma,mc,md,me,mg,mh,mk,ml,mm,mn,mo,mp,mq,mr,ms,mt,mu,mv,mw,mx,my,mz,na,nc,ne,nf,ng,ni,nl,no,np,nr,nu,nz,om,pa,pe,pf,pg,ph,pk,pl,pm,pn,pr,ps,pt,pw,py,qa,re,ro,ru,rs,rw,sa,sb,sc,sd,se,sg,sh,si,sj,sk,sl,sm,sn,so,sr,ss,st,su,sv,sx,sy,sz,tc,td,tf,tg,th,tj,tk,tl,tm,tn,to,tp,tr,tt,tv,tw,tz,ua,ug,uk,um,us,uy,uz,va,vc,ve,vg,vi,vn,vu,wf,ws,ye,yt,yu,za,zm,zw,рф,укр,сайт,онлайн,срб,cat,pro,local'.split(','), topDomain) == -1) {
  95.                     if (!/^[a-zA-Z]+$/.test(topDomain) || !matches[2]) {
  96.                         return matches[0];
  97.                     }
  98.                 }
  99.  
  100.                 if (matches[0].indexOf('@') != -1) {
  101.                     return matches[0];
  102.                 }
  103.                 try {
  104.                     full = decodeURIComponent(full);
  105.                 } catch (e){}
  106.  
  107.                 if (full.length > 55) {
  108.                     full = full.substr(0, 53) + '..';
  109.                 }
  110.                 full = clean(full).replace(/&amp;/g, '&');
  111.  
  112.                     url = replaceEntities(url).replace(/([^a-zA-Z0-9#%;_\-.\/?&=\[\]])/g, encodeURIComponent);
  113.                     var tryUrl = url, hashPos = url.indexOf('#/');
  114.                     if (hashPos >= 0) {
  115.                         tryUrl = url.substr(hashPos + 1);
  116.                     } else {
  117.                         hashPos = url.indexOf('#!');
  118.                         if (hashPos >= 0) {
  119.                             tryUrl = '/' + url.substr(hashPos + 2).replace(/^\//, '');
  120.                         }
  121.                     }
  122.                     return prefix + '<a href="'+ (protocol + url).replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;') + '" target="_blank">' + full + '</a>';
  123.             });
  124.  
  125.     return replacedText;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement