1

我试图用图像标签替换给定字符串中的表情符号,前提是它不在某个字符组内。

鉴于:

var reg = /(?!<):\/(?![^<>]*>)/g,
    string = ':/ <a href="http://blah.com">http://blah.com</a> :/',
    result = string.replace(reg, 'IMG');

结果:IMG <a href="http://blah.com">httpIMG/blah.com</a> IMG

我想知道是否有一种方法可以忽略 HTML 标签内的替换,而不仅仅是在<>.

4

3 回答 3

1

Maybe this is not the best solution but if you use jQuery the following "oneliner" can do the job:

var str = ":/ <a href='http://blah.com'>http://blah.com</a> :/";

$("<div />", { html : str }).contents().each(function() {
    if (this.nodeType === 3)
        this.nodeValue = this.nodeValue.replace(/:\//g, "IMG");
}).end().html();

DEMO: http://jsfiddle.net/Hfnje/

于 2013-01-15T00:08:59.347 回答
0

为什么不将其与单词边界匹配?

/\B:\/\B/

这将匹配::
/
foo:/ bar

但不是:
http://
foo:/bar

于 2013-01-14T23:55:05.227 回答
0

在@VisioN 的帮助下,我设法想出了这个:

message =
  $('<div />', html: message).contents().each(->
    if @nodeType is 3
      for replacement, emoticons of self.emoticons
        for emoticon in emoticons
          @nodeValue = @nodeValue.replace new RegExp(emoticon, 'g'),
            $('<span />', class:'emoticon ' + replacement, title: emoticon)[0].outerHTML

      $(@).replaceWith @nodeValue
  ).end().html()

它不漂亮,但它正在工作。

于 2013-01-15T02:09:45.977 回答