szczepaniakdominik
szczepaniakdominik

Reputation: 472

Find and replace all matches in a string

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

Answers (5)

Emeeus
Emeeus

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 &#8222 expression did't find a match.

Upvotes: 1

user7637745
user7637745

Reputation: 985

Solution 1

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

Solution 2

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

Solution 3 (customizable replacements)

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

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

Nina Scholz
Nina Scholz

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

Elliot Blackburn
Elliot Blackburn

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 &#8211 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

Related Questions