>  기사  >  백엔드 개발  >  javascript - 如何实时替换编辑器内的文本成为链接?

javascript - 如何实时替换编辑器内的文本成为链接?

WBOY
WBOY원래의
2016-06-06 20:48:111192검색

例如知乎编辑器内,如果粘贴了一段网址,会自动转换为链接。
stack 上找到的代码不知道该如何用,大家可以看看。

<code>function replaceURLWithHTMLLinks(text) {
    var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
    return text.replace(exp,"<a href="%241">$1</a>"); 
   }
</code>

是监视 keyup 来替换的吗?希望得到大家的解答!谢谢!

*** // Update:2013-12-09 :***

编辑器为 <div contenteditable="true"></div>

回复内容:

例如知乎编辑器内,如果粘贴了一段网址,会自动转换为链接。
stack 上找到的代码不知道该如何用,大家可以看看。

<code>function replaceURLWithHTMLLinks(text) {
    var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
    return text.replace(exp,"<a href="%241">$1</a>"); 
   }
</code>

是监视 keyup 来替换的吗?希望得到大家的解答!谢谢!

*** // Update:2013-12-09 :***

编辑器为 <div contenteditable="true"></div>

不推荐用keyup事件,因为它对非键盘操作的动作没反应,比如鼠标粘贴进来一个网址。这时候需要用onPropertyChange事件,能够对textarea内的属性值的变化产生动作。

另外,正则部分推荐最后加一个空格判定,也就是URL+空格才解析为链接形式,如果是之前的匹配的话会造成死循环。

http://jsfiddle.net/5kmqe/1/

<code class="lang-javascript">  linkify: function(inputText) {
        var replacedText, replacePattern1, replacePattern2, replacePattern3;
        var originalText = inputText;
        //URLs starting with http://, https://, file:// or ftp://
        replacePattern1 = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi;
        //URLs starting with "www." (without // before it, or it'd re-link the ones done above).
        replacePattern2 = /(^|[^\/f])(www\.[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi;
        //Change email addresses to mailto:: links.
        replacePattern3 = /(([a-zA-Z0-9\-\_\.])+@[a-zA-Z\_]+?(\.[a-zA-Z]{2,6})+)/gi;
        //If there are hrefs in the original text, let's split
        // the text up and only work on the parts that don't have urls yet.
        var count = originalText.match(/<a href if> 0) {
            var combinedReplacedText;
            //Keep delimiter when splitting
            var splitInput = originalText.split(/()/g);

            for (i = 0; i $1</a>').replace(replacePattern2, '$1<a href="http://%242" target="_blank">$2</a>').replace(replacePattern3, '<a href="mailto:%241">$1</a>');
                }
            }
            combinedReplacedText = splitInput.join('');
            return combinedReplacedText;
        } else {
            replacedText = inputText.replace(replacePattern1, '<a href="%241" target="_blank">$1</a>');
            replacedText = replacedText.replace(replacePattern2, '$1<a href="http://%242" target="_blank">$2</a>');
            replacedText = replacedText.replace(replacePattern3, '<a href="mailto:%241">$1</a>');
            return replacedText;
        }
    },
</code>

对一段文本,可重复运行。

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.