Reputation: 472
I'm trying to create a filter to replace characters in articles.
I want to find all matching elements in a string and replace them with an element from an array, but it doesn't work. How to fix it?
//string to replace -> ”Lorem ipsum dolor sit amet – consectetur adipiscing elit. Suspendisse vitae augue ornare, ultricies ligula at, tempor felis – aenean ac placerat turpis. Nullam finibus lacus sit amet tortor consequat, venenatis malesuada eros volutpat. Proin varius nibh sit amet urna lobortis placerat. Donec rhoncus nibh vitae ultricies rutrum. Curabitur porta nisi eu rhoncus pulvinar. Nulla sit amet sollicitudin odio. Aliquam mi odio, malesuada ac arcu vitae, bibendum convallis risus.„
function charReplace(value) {
let desc = value;
const toReplace = {
'–': '–',
'”': '"',
'„': '"'
};
for (let key in toReplace) {
desc.replace(key, toReplace[key]);
}
return desc;
}
Upvotes: 1
Views: 312
Reputation: 5250
This is I think the shortest. There is no need of loop, you could use just replace()
You can specify a function as the second parameter. In this case, the function will be invoked after the match has been performed.
like this:
var str = "”Lorem ipsum dolor sit amet – consectetur adipiscing elit. Suspendisse vitae augue ornare, ultricies ligula at, tempor felis – aenean ac placerat turpis. Nullam finibus lacus sit amet tortor consequat, venenatis malesuada eros volutpat. Proin varius nibh sit amet urna lobortis placerat. Donec rhoncus nibh vitae ultricies rutrum. Curabitur porta nisi eu rhoncus pulvinar. Nulla sit amet sollicitudin odio. Aliquam mi odio, malesuada ac arcu vitae, bibendum convallis risus.„";
str = str.replace(/(–)|(”)|(„)/g,(str, p1, p2, p3)=>{
if(p1) return "–";
if(p2 || p3 ) return '"';
});
console.log(str);
Keep in mind in that expression, we are looking for exact match of –
, ”
and „
so if you have „
expression did't find a match.
Upvotes: 1
Reputation: 985
With .split(...).join(...)
:
// string to replace
const string = '”Lorem ipsum dolor sit amet – consectetur adipiscing elit. Suspendisse vitae augue ornare, ultricies ligula at, tempor felis – aenean ac placerat turpis. Nullam finibus lacus sit amet tortor consequat, venenatis malesuada eros volutpat. Proin varius nibh sit amet urna lobortis placerat. Donec rhoncus nibh vitae ultricies rutrum. Curabitur porta nisi eu rhoncus pulvinar. Nulla sit amet sollicitudin odio. Aliquam mi odio, malesuada ac arcu vitae, bibendum convallis risus.„';
function charReplace(value) {
const toReplace = {
'–': '–',
'”': '"',
'„': '"'
};
let desc = value;
for (const key of Object.keys(toReplace)) {
desc = desc.split(key).join(toReplace[key]);
}
return desc;
}
console.log(charReplace(string));
With iterating over the replacements and replace them using .replace(new RegExp(...))
:
// string to replace
const string = '”Lorem ipsum dolor sit amet – consectetur adipiscing elit. Suspendisse vitae augue ornare, ultricies ligula at, tempor felis – aenean ac placerat turpis. Nullam finibus lacus sit amet tortor consequat, venenatis malesuada eros volutpat. Proin varius nibh sit amet urna lobortis placerat. Donec rhoncus nibh vitae ultricies rutrum. Curabitur porta nisi eu rhoncus pulvinar. Nulla sit amet sollicitudin odio. Aliquam mi odio, malesuada ac arcu vitae, bibendum convallis risus.„';
function charReplace(value) {
const toReplace = {
'–': '–',
'”': '"',
'„': '"'
};
let desc = value;
for (const entity of Object.keys(toReplace)) {
desc = desc.replace(new RegExp(entity, 'g'), toReplace[entity]);
}
return desc;
}
console.log(charReplace(string));
With joining the replacements and use a replacer function:
.replace(new RegExp(Object.keys(replacements).join('|'), 'g'), match => replacements[match])
// string to replace
const string = '”Lorem ipsum dolor sit amet – consectetur adipiscing elit. Suspendisse vitae augue ornare, ultricies ligula at, tempor felis – aenean ac placerat turpis. Nullam finibus lacus sit amet tortor consequat, venenatis malesuada eros volutpat. Proin varius nibh sit amet urna lobortis placerat. Donec rhoncus nibh vitae ultricies rutrum. Curabitur porta nisi eu rhoncus pulvinar. Nulla sit amet sollicitudin odio. Aliquam mi odio, malesuada ac arcu vitae, bibendum convallis risus.„';
function replace(string, replacements) {
return string.replace(new RegExp(Object.keys(replacements).join('|'), 'g'), match => replacements[match]);
}
console.log(replace(string, {
'–': '–',
'”': '"',
'„': '"'
}));
Upvotes: 0
Reputation: 153
JS replace function return value and you should assign value then use that
let desc = value;
const toReplace = {
'–': '–',
'”': '"',
'„': '"'
};
for (let key in toReplace) {
desc = desc.replace(key, toReplace[key]);
}
return desc;
I hope it will help you.
Upvotes: 1
Reputation: 386710
You could use a regular expression with all joined keys with pipe (the regular expressions sign for alternative) and take for replacent a function which takes the found key as key for the replacement object.
function charReplace(value) {
const toReplace = { '–': '–', '”': '"', '„': '"' };
return value.replace(
new RegExp(Object.keys(toReplace).join('|'), 'g'),
k => toReplace[k]
);
}
var string = "”Lorem ipsum dolor sit amet – consectetur adipiscing elit. Suspendisse vitae augue ornare, ultricies ligula at, tempor felis – aenean ac placerat turpis. Nullam finibus lacus sit amet tortor consequat, venenatis malesuada eros volutpat. Proin varius nibh sit amet urna lobortis placerat. Donec rhoncus nibh vitae ultricies rutrum. Curabitur porta nisi eu rhoncus pulvinar. Nulla sit amet sollicitudin odio. Aliquam mi odio, malesuada ac arcu vitae, bibendum convallis risus.„";
console.log(charReplace(string));
Upvotes: 1
Reputation: 4164
If you try to replace using a string, it'll only replace the first instance of that string. If you use regex instead it'll replace all matches of that string. This should be fairly simple and regex is very readable. I would do something like this:
const replacements = [
{ regex: /–/, replacement: '-' },
{ regex: /”/, replacement: '"' },
{ regex: /„/, replacement: '"' }
];
let newStr = '”Lorem ipsum dolor sit amet – consectetur...'; // Full str
replacements.forEach(set => {
newStr = newStr.replace(set.regex, set.replacement);
});
I've not tested the above code, but the essence of it should work just fine within your function. If you want to expand it, simply expand your replacements array.
Upvotes: 1