2

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

1 回答 1

6

描述

我认为我解决这个问题的方法是将所有坏事与所有好事相匹配。然后在表达式中只将我感兴趣的文本字形放入捕获组。稍后在编程逻辑中,我将测试每个匹配以查看是否填充了捕获组 1,如果是,那么匹配.index将显示字符串中的位置匹配发生。

此表达式将找到所有:/, :), :p, 标记和 url,但捕获组 1 将仅包含:), :/, or:p不属于标记或 url 的部分。

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

在此处输入图像描述

展开

  • https?:\/\/[^\s]*匹配纯文本中的 url
  • |或者
  • <\/?\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] => 
    )
于 2013-06-28T13:06:56.877 回答