Игнорируя encodeURIComponent
, я бы, вероятно, использовал функциональность обратного вызова replace
:
function encodeURLBreakers(query) {
const URLBreakers = {
'/': '%2F',
'\\?': '%3F',
'#': '%23'
};
const regex = new RegExp(Object.keys(URLBreakers).join("|"), "g");
return query.replace(regex, match => URLBreakers[match]);
}
Сделано в функцию многократного использования:
function makeReplacer(map) {
const regex = new RegExp(Object.keys(map).join("|"), "g");
return string => string.replace(regex, match => map[match]);
}
const encodeURLBreakers = makeReplacer({
'/': '%2F',
'\\?': '%3F',
'#': '%23'
});
В этом трюке используются альтернативы регулярному выражению, чтобы вообще избежать зацикливания.Если бы вам абсолютно необходимо было сделать это итеративно (например, потому что порядок имел значение, а некоторые выражения соответствовали результатам предыдущих замен), я бы выбрал reduce
:
function encodeURLBreakers(string) {
return [
[/\//g, '%2F'],
[/?/g, '%3F'],
[/#/g, '%23'],
].reduce(
(str, [regex, replacement]) => str.replace(regex, replacement),
string
);
}