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

时间:2013-06-28 11:21:14

标签: javascript regex

我正在使用img标签替换文本编辑器中的笑脸快捷键,但我使用的逻辑也将链接和标签的一部分视为笑脸快捷键(例如中的:/ :http: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] +'">'));
    }
}

1 个答案:

答案 0 :(得分:6)

描述

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

此表达式会找到所有:/:):p,标记和网址,但捕获组1只会包含:):/ ,或:p,它们不属于标记或网址。

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

enter image description here

扩展

  • 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

<强>匹配

[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] => 
    )