替换内容而忽略链接和html标记

Pin*_*nky 2 javascript regex

我正在使用img标签替换我的文本编辑器中的笑脸快捷方式,但我使用的逻辑也将链接和标签的部分视为笑脸快捷键(例如:/http://中,或者:p游标中:指针在风格中属性)

如何在用图像替换笑脸快捷方式时忽略所有链接和html标记?

for(var key in shortcuts){
    // Check if the editor html contains the looped shortcut
    if(content.toLowerCase().indexOf(key) != -1){
        // Escaping special characters to be able to use the shortcuts in regular expression
        var k = key.replace(/[<>*()?']/g, "\\$&");

        // Make shortcuts case insensitive
        var regex = new RegExp(k, "ig");

        //Replace shortcuts with img tags (smileys)
        tinymce.activeEditor.setContent(content.replace(regex,'<img src="images/transparent.png" class="smiley_icon '+ shortcuts[key] +'">'));
    }
}
Run Code Online (Sandbox Code Playgroud)

Ro *_* Mi 6

描述

我认为我采用的方法是将所有不好的东西与一切好的东西相匹配.然后在表达式中只将我感兴趣的文本字形放入捕获组.稍后在编程逻辑中我将测试每个匹配以查看捕获组1是否已填充,如果是,则匹配.index将显示字符串中的位置匹配发生了.

这个表达式会发现所有的:/,:),:p,标签和URL,但捕获组1将仅包含:),:/或者:p这是不是一个标签或URL的一部分.

https?:\/\/[^\s]*|<\/?\w+\b(?=\s|>)(?:='[^']*'|="[^"]*"|=[^'"][^\s>]*|[^>])*>|(:\)|:P|:\/)

在此输入图像描述

扩展

  • https?:\/\/[^\s]* 匹配纯文本的网址
  • | 要么
  • <\/?\w+\b(?=\s|>)(?:='[^']*'|="[^"]*"|=[^'"][^\s>]*|[^>])*> 匹配任何打开或关闭的html标签
  • | 要么
  • (:\)|:P|:\/) 捕获组1将获得所需的文本字形

例:

实例:http://regexr.com?35cv9(将鼠标悬停在蓝色匹配项上,查看每个捕获组和索引)

示范文本

<a href=http://i.like.kittens style="cursor:point"> :) I had a :/ great time :p </a> check out http://some.url.com
Run Code Online (Sandbox Code Playgroud)

火柴

[0] => Array
    (
        [0] => <a href=http://i.like.kittens style="cursor:point">
        [1] => :)
        [2] => :/
        [3] => :p
        [4] => </a>
        [5] => http://some.url.com
    )

[1] => Array
    (
        [0] => 
        [1] => :)
        [2] => :/
        [3] => :p
        [4] => 
        [5] => 
    )
Run Code Online (Sandbox Code Playgroud)