正则表达式将表情符号与文本分开

时间:2012-07-08 16:29:22

标签: javascript regex expression

我正在尝试在Javascript中创建一个正则表达式,以便将:)与周围文本分开。

鉴于以下内容:

  

:)这是一行文字:)里面有几个表情符号:)。所以那里,。:):)

我想得到8组:

  1. :)
  2. 这是一行文字
  3. :)
  4. 里面有几个笑脸
  5. :)
  6. 。所以那里。,
  7. :)
  8. :)
  9. 目前我使用的([^:)]+)只对没有表情符号的周围文本进行分组。我可以进行哪些调整,以便将笑脸分组?

4 个答案:

答案 0 :(得分:2)

分裂:

var string = "Given the following: :)This is a line of text :) with several smileys in it :). So there.,:):)";
var groups = string.split(/:\)/);

这将返回一个数组,其中每个元素都是没有:)的文本的一部分。

由于文本已在每个:)上拆分,我们可以通过在文本的每个部分之间添加:)来构建您想要的结果:

var parts = [groups[0]];
for (var i = 1; i < groups.length; ++i) {
    parts.push(':)');
    parts.push(groups[i]);
}

结果如下:

  1. :)
  2. 这是一行文字
  3. :)
  4. 里面有几个笑脸
  5. :)
  6. 。所以那里。,
  7. :)
  8. :)
  9. 在此处尝试:http://jsfiddle.net/Gxr6U/3/


    如果您想用图像替换表情符号,可以这样做:

    var frags = document.createDocumentFragment();
    
    frags.appendChild(document.createTextNode(groups[0]));
    
    for (var i = 1; i < groups.length; ++i) {
    
        var img = document.createElement('img');
        img.src='http://../smiley.png';
    
        frags.push(img);
    
        frags.appendChild(document.createTextNode(groups[i]));
    }
    

    如果你只想删除表情符号:

    var text = groups.join('');
    

答案 1 :(得分:2)

我建议:

var str = ":)This is a line of text :) with several smileys in it :). So there.,:):)",
    matches = str.split(/(\:\))/);
console.log(matches);​

JS Fiddle demo

添加了过滤以从上面删除空匹配:

var str = ":)This is a line of text :) with several smileys in it :). So there.,:):)",
    matches = str.split(/(\:\))/),
    matched = [];
for (var i = 0, len = matches.length; i < len; i++) {
    if (matches[i].length) {
        matched.push(matches[i]);
    }
}
console.log(matched);​

JS Fiddle demo

另一个版本,带有实际的屏幕输出:

var str = ":)This is a line of text :) with several smileys in it :). So there.,:):)",
    matches = str.split(/(\:\))/),
    matched = [], li,
    list = document.createElement('ol');
document.body.appendChild(list);
for (var i = 0, len = matches.length; i < len; i++) {
    if (matches[i].length) {
        matched.push(matches[i]);
        li = document.createElement('li');
        txt = document.createTextNode(matches[i]);
        li.appendChild(txt);
        list.appendChild(li);
    }
}
console.log(matched);​

JS Fiddle demo

答案 2 :(得分:0)

以下内容将成功分组您提到的字符串:

your_match = your_string.match(/(:\)|[^:)]*)/g)

但是,与原始的RegExp一样,如果出现:)而没有笑脸,则会遇到问题。如果没有笑脸,这些角色将从匹配组中消失。

答案 3 :(得分:0)

您可以使用此模式:

/:\)|(?:[^:]+|:(?!\)))+/g

这匹配:)或除:之外的任何字符或未跟随:的{​​{1}}。