2016-10-03 203 views
1

我有類似在同一行匹配多個模式

var string = "<h1>Hi {{name|there}}</h1> 
<p>This is a message<br> 
</p> 
<p>Hello hello</p>" 

我想找到所有{{...}}標籤和第一屬性(的左側|)替換它用相應的值。如果該值不存在,我想用右側的'fallback'代替標籤(在這種情況下,字符串'there')

到目前爲止,我嘗試了類似下面的內容,但是它沒有得到羣體

/{{(.+)|(.+)}}/ 

任何想法?

+0

向我們展示你試過嗎? –

+0

你的意思是可以有'{{name | there}}'(=>'name'),或者{{| there}}(=>'there')或'{{there}}(= >'there')? –

回答

1

你可以做這樣的事情:

var string = "<h1>Hi {{name|there}}</h1> <p>This is a message<br></p><p>Hello hello</p>"; 
 

 
// If the variable exists 
 
console.log(parse(string, {name: "Tony"})); 
 

 
// If the variable is not set 
 
console.log(parse(string, {potato: "Tony"})); 
 

 
function parse(str, values){ 
 
    str = str.replace(/\{\{(.*)\|(.*)\}\}/g,function(arg, match1, match2){ 
 
    var data = match1.split("|"); 
 
    var variable = match1; 
 
    var fallback = match2; 
 
    var replace = fallback; 
 

 
    if(typeof(values[variable]) != "undefined"){ 
 
     replace = values[variable]; 
 
    } 
 
    return replace; 
 
    }); 
 
    return str; 
 
}

0

您應該轉義所有這些字符:{}

string.match(/\{\{(.+)\|(.+)\}\}/) 
1

如果輸入可以像{{name|there}}(=>name),或{{|there}}(=>there)或{{there}}( =>there),您可以使用以下方法:

var string = `<h1>Hi {{name|there}}</h1> 
 
<p>This is a {{|message}}<br> 
 
</p> 
 
<p>Hello {{hello}}</p>`; 
 
var rx = /{{(.*?)(?:\|(.*?))?}}/g; 
 
console.log(string.replace(rx, function(m,g1,g2) { 
 
    return g1 ? g1 : g2; 
 
}));

詳細

  • {{ - 字面{{文本
  • (.*?) - 第1組捕獲任何0+字符不是換行符符號儘可能少到第一
  • 其他
  • (?:\|(.*?))? - 可選序列
    • \| - 字面|
    • (.*?) - 組2捕獲任何0+字符比換行符符號之外儘可能少到第一
  • }} - 字面}}文本。

在替換中,首先檢查組1,如果它不是空的,則返回其內容。否則,將返回組2的內容。

1

您可能會這樣做;

var str = "<h1>Hi {{name|there}}</h1>", 
 
    val1 = "muçaços", 
 
    val2 = undefined, 
 
    str1 = str.replace(/\{\{(\w+)\|(\w+)\}\}/,(m,p1,p2) => val1||p2), 
 
    str2 = str.replace(/\{\{(\w+)\|(\w+)\}\}/,(m,p1,p2) => val2||p2); 
 
console.log(str1); 
 
console.log(str2);