在javascript中有类似PHP的preg_replace_callback()吗?

时间:2010-06-04 03:15:25

标签: javascript regex

我想做的是str.replace(pattern, callback)

不仅仅是str.replace(pattern, replace_pattern)

可以在javascript中完成吗?

3 个答案:

答案 0 :(得分:15)

为什么,是的,你可以做到这一点:str.replace(pattern, function () { ... })

以下是一些文档:https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/String/replace

答案 1 :(得分:5)

var s2 = s1.replace(/regex/, function(whole, part1, part2, ...) { ... })

该函数作为第一个参数传递整个匹配的字符串。如果有任何捕获组,则将它们作为后续参数传递。

答案 2 :(得分:0)

一般情况下,s1.replace(/regex/, function(whole, part1, part2, ...partN) { ... })没有解决方案,您需要了解所有部分,并且它不是有效的g选项;

任意数量的订单

RegExp('\{([^\}]*)\}', 'g')的示例可以通过循环解决...假设URI模板问题,用全局getData字典替换每个占位符。

const tpl = 'myEtc/{aa}/etc1/{bb}/etc2'
const getData = {"aa":"expandAA","bb":"expandBB"}

function expandTpl(getData,s0){  // s0 is the link_template_input
  const r = RegExp('\{([^\}]*)\}', 'g');
  let s = '';
  let idx=0
  for (let a; (a=r.exec(s0)) !== null;) {
    s   += ( s0.substring(idx, r.lastIndex-a[0].length) + getData[a[1]] )
    idx = r.lastIndex
  }
  if ( idx<s0.length ) s += s0.substring(idx,s0.length)
  return s
}

console.log( tpl )
console.log( expandTpl(getData,tpl) )