2017-02-27 89 views
1

我正在搜索项目有关emoji与图标 replace,但我有一些问题上regular expression,下文提到的是我的参考代码:JavaScript正则表达式替换为

var f = ["(:3)" , "(:P)","\(:star:\)"]; 

var re = function(s){return new RegExp(s, 'g');}; 

现在时我要搜一下emojireplace,如下所示:

s = "hello :D how are you :P dwdwd"; 
for(var n in f){  

var m; 
if ((m = re(f[n]).exec(s)) !== null) { 

m.forEach((match, groupIndex) => { 
    s = s.replace(match,"<img src='http://abs.twimg.com/emoji/v1/72x72/"+ r[n] +".png'>"); 
}); 

}} 

在这种情况下,它运作良好,并更换emoji。但它只是在emoji之前和之后有空间时才会替换,我应该怎么做来替换字符串或结尾处的emoji

s = ":D hello how are you :)"; 

这种情况下不起作用。如何编辑我的regular expression为能够取代emoji在开始和字符串的结尾,并在同一时间,如果它在串&的中部发现字和emoji之间有空间

我与regular expression第二个问题是"\(:star:\)"它从来没有取代。虽然它必须用替换emoji,但我想我错过了regular expression的一些东西。

+0

首先,它不是一个好主意,用'for..in'上的对象 – Rajesh

+0

@Rajesh为什么它的循环一样'(VAR我= 0; ......)' –

+0

'for..in'是为了循环对象的属性。因此,在旧的浏览器,'for..in'还会遍历'.length'财产 – Rajesh

回答

1

您可以使用开始&结尾锚以及管道来实现此目的。例如:

/(^:3\s)|(\s:3\s)|(\s:3$)/g

^是匹配:3\s到字符串的开头的锚。

$是一个匹配\s:3到字符串末尾的锚点。

\s匹配空格。

|是作为不同捕获组之间的逻辑OR运算符的管道运算符。

+0

感谢其对我的代码工作,其将是'变种F = [” (^:3个\\ S)|(\\ S:3个\\ S)|(\\ S:3 $)”,...]'因为我使用'新RegExp' 更多信息[点击这里] (https://www.w3schools.com/jsref/jsref_regexp_whitespace.asp) –

0

只需删除表情符号正则表达式的空格。

var f = ["(:3)", "(:P)", "\(:star:\)"]; 
 
var r = ["[sadface]", "[toungeface]", "[staremoji]"]; 
 

 
var re = function(s) { 
 
    return new RegExp(s, 'g'); 
 
}; 
 

 
s = "hello :3 how are you :P dwdwd :star: :3"; 
 
console.log(s); 
 
for (var n in f) { 
 
    var m; 
 
    if ((m = re(f[n]).exec(s)) !== null) { 
 
    m.forEach((match, groupIndex) => { 
 
     s = s.replace(match, r[n]); 
 
    }); 
 
    } 
 
} 
 

 
console.log(s);

+1

如果你读过他说,如果它在字符串中发现,必须有文字和表情符号之间的空间问题。你的代码也适用于hello:3和hello [sadface],它不应该。 – vatz88

0

var content = "hello :D how are you :P dwdwd"; 
 
content = content.replace(/((:D|:P))/g,function(match){ 
 
    var result = ""; 
 
    
 
    var index = -1; 
 
    switch(match) 
 
    { 
 
    case ":D": 
 
     result = "happy"; 
 
     index = 0 
 
     break; 
 
    case ":P": 
 
     result = "smilie"; 
 
     index = 1 
 
     break; 
 
    } 
 
    if(index != -1) 
 
    { 
 
    return "<img src='http://abs.twimg.com/emoji/v1/72x72/"+index+".png'>"; 
 
    } 
 
    return result; 
 
}); 
 
console.log(content);

请试试这个。

0

我创建了一个更通用的解决方案,从emojis到相关名称的映射开始。需要被保持同步,而不是两个名单,我用一个单独的对象:

const emojis = { 
    '(c)': 'a9', 
    '(r)': 'ae', 
    '(tm)': '2122' 
    //, ... 
}; 

这令我更加有用的结构与工作,但下面的代码可以很容易地被改变,以应对双列表版本。

然后我使用一个辅助功能,通过与\前面加上他们逃离这是不允许的正则表达式中明文字符:

const escapeSpecials = (() => { 
    const specials = ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\']; 
    const reg = new RegExp('(\\' + specials.join('|\\') + ')', 'g'); 
    return str => str.replace(reg, '\\$1'); 
})(); 

然后,我有钥匙功能:

const replaceStringsWith = (emojis, convert) => str => Object.keys(emojis).reduce(
    (str, em) => str.replace(new RegExp(`(^|\\s+)(${escapeSpecials(em)})($|\\s+)`, 'g'), 
          (m, a, b, c) => `${a}${convert(emojis[b], b)}${c}`), 
    str 
); 

这需要一个包含字符串/替换对的对象和一个接受替换的转换器函数,并返回最终形式。它返回一个函数,该函数接受一个字符串,然后搜索该对象关键字上的任何匹配(正确检查字符串或字符串结尾),将其替换为针对特定键的对象值调用转换器的结果。

因此,我们可以这样做:

const toUrl = (name) => `<img src='http://abs.twimg.com/emoji/v1/72x72/${name}.png'>`; 
const replaceEmojis = replaceStringsWith(emojis, toUrl) 

,并把它作为

const s = "This is Copyright (c) 2017, FooBar is (tm) BazCo (r)"; 
replaceEmojis(s); //=> 
// `This is Copyright <img src='http://abs.twimg.com/emoji/v1/72x72/a9.png'> 
// 2017, FooBar is <img src='http://abs.twimg.com/emoji/v1/72x72/2122.png'> 
// BazCo <img src='http://abs.twimg.com/emoji/v1/72x72/ae.png'>` 

注意,转换器还需要第二个参数。所以,你可以改用

const toUrl = (name, emoji) => 
    `<img src='http://abs.twimg.com/emoji/v1/72x72/${name}.png' title='${emoji}'>`; 

得到

//=> `This is Copyright <img  
// src='http://abs.twimg.com/emoji/v1/72x72/a9.png' title='(c)'> 
// 2017, FooBar is <img src='http://abs.twimg.com/emoji/v1/72x72/2122.png' 
// title='(tm)'> BazCo <img src='http://abs.twimg.com/emoji/v1/72x72/ae.png' title='(r)'>"