Piszę podgląd BBCode, a jednym z elementów jest zamiana linków na kod HTML. Niestety, linki są zamieniane podwójnie, w wyniku czego na wyjściu otrzymujemy:
Kod
Witaj świecie http://www.onet.pl">www.onet.pl a teraz http://wp.pl">WP!!!
Wejściowy ciąg znaków
Kod
Witaj świecie www.onet.pl a teraz [url=http://wp.pl]WP[/url]!!!
Kod JavaScript odpowiedzialny za ww. operację jest następujący:
[JAVASCRIPT] pobierz, plaintext
  1. var furl = function(match,txt)
  2. {
  3. var url = txt;
  4. if(url.indexOf('www.')===0) url = 'http://'+url;
  5. if(txt.length>30) txt = txt.substr(0,21)+'...'+txt.substr(-8);
  6. return txt.link(url)
  7. };
  8. var ffurl = function(match,url,txt)
  9. {
  10. if(url.indexOf('www.')===0) url = 'http://'+url;
  11. return txt.link(url)
  12. }
  13. text = text.replace(/\[color=([A-Za-z0-9#].*?)\](.*?)\[\/color\]/gi, '<span style="color:$1">$2</span>');
  14. text = text.replace(/\[url]([^\]].*?)\[\/url\]/gi, furl);
  15. text = text.replace(/\[url=([^\]]+)\](.*?)\[\/url\]/gi, ffurl);
  16. text = text.replace(/(www\.[a-z0-9\-]+\.[a-z0-9\-.\~,\?!%\*_\#:;~\\&$@\/=\+]*)(?!["<]+?)/gi, furl);
  17. text = text.replace(/(http+s?:\/\/[a-z0-9\-]+\.[a-z0-9\-.\~,\?!%\*_\#:;~\\&$@\/=\+]*)(?!["<]+?)/gi, furl);
[JAVASCRIPT] pobierz, plaintext

Dodałem kwantyfikator (?!["<]+?) ale obcina tylko ostatnią literkę adresu. Zmiana kolejności też nie pomaga. Jak poprawić powyższy kod, aby linki były zamieniane prawidłowo? Czy da się go uprościć?