正则表达式替换为关联数组(正则表达式模式)

时间:2014-04-16 17:21:27

标签: javascript arrays regex

本质上,此代码搜索字符串,根据每个正则表达式模式查找和替换,然后再将更新的变量吐出。

我很难将它从PHP代码转换为Javascript:

在PHP中我已经实现了它:

$dataPreg = array(
'/(.*)\s§/' => '$1 <span class="suppSmall">quasi</span>',
'/(\bor|and\b)/'=>'<span class="orChar">$1</span>',
'/\:(\s*see[\:]?)/'=>'<span class="orChar"> $1: </span>'
);

$root = preg_replace(array_keys($dataPreg),array_values($dataPreg),$root);

return $root;

在Javascript中我试图将其移植到:

var dataPreg = {
'/(.*)\s§/':'$1 <span class="suppSmall">quasi</span>',
'/(\bor|and\b)/':'<span class="orChar">$1</span>',
'/\:(\s*see[\:]?)/':'<span class="orChar"> $1: </span>'
};

for (var val in dataPreg)
$string = $string.replace(new RegExp(val, "g"), dataPreg[val]);
return $string;

毋庸置疑,它不能在Javascript中工作,我无法弄清楚原因。它不会触发任何JS错误,它只返回字符串back..unchanged。

3 个答案:

答案 0 :(得分:1)

RegExp将模式作为参数而没有分隔符。例如,它需要[a-z]+作为参数,而不是像在PHP中那样使用/[a-z]+/。因此,请从正则表达式的两端删除//分隔符。一个例子:

'(.*)\s§':'$1 <span class="suppSmall">quasi</span>',
 ^ the / is gone

答案 1 :(得分:1)

您的数组字符串不适合创建new RegExp对象。 (使用分隔符和单个转义属性,例如\s而不是\\s)。

请改为尝试:

dataPreg = {
'/(.*)\\s§/g':'$1 <span class="suppSmall">quasi</span>',
'/(\\bor|and\\b)/g':'<span class="orChar">$1</span>',
'/:(\\s*see:?)/g':'<span class="orChar"> $1: </span>'
};
for (var val in dataPreg)
    $string = $string.replace(val, dataPreg[val]);
return $string;

答案 2 :(得分:1)

Objects 的键应该是 Strings ,因此我建议您使用 Objects Objects 来节省工作量和周期em>,即

var dataPreg = [
    {re: /(.*)\s§/g        , sub: '$1 <span class="suppSmall">quasi</span>'},
    {re: /(\bor|and\b)/g   , sub: '<span class="orChar">$1</span>'},
    {re: /\:(\s*see[\:]?)/g, sub: '<span class="orChar"> $1: </span>'}
];

然后

(function () {
    var i; // don't pollute namespace ;)
    for (i = 0; i < dataPreg.length; ++i)
        $string = $string.replace(dataPreg[i].re, dataPreg[i].sub);
}());

e.g。

var $string = 'foo § bar or then and you :see: here';
/* becomes
foo <span class="suppSmall">quasi</span> bar <span class="orChar">or</span> then <span class="orChar">and</span> you <span class="orChar"> see:: </span> here
*/