2017-02-27 143 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)'>"