本质上,此代码搜索字符串,根据每个正则表达式模式查找和替换,然后再将更新的变量吐出。
我很难将它从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。
答案 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
*/