regex替换为(regex模式的)关联数组

regex replace with associative array (of regex patterns)

本文关键字:regex 关联 数组 模式 替换      更新时间:2023-09-26

本质上,这段代码搜索字符串,根据这些正则表达式模式中的每一个进行查找和替换,然后将更新后的变量吐回。

我很难将它从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错误,只是返回字符串。。不变。

对象的键应该是字符串,所以我建议您使用数组来节省工作量和周期,即

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);
}());

例如

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
*/

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

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

您的数组字符串不适合创建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;