Найти и заменить все совпадения в строке - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь создать фильтр для замены символов в статьях.

Я хочу найти все подходящие элементы в строке и заменить их элементом из массива, но это не работает. Как это исправить?

//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;
} 

Ответы [ 5 ]

0 голосов
/ 27 июня 2018

JS заменяет возвращаемое значение функции, и вы должны присвоить значение, затем использовать это

          let desc = value;
            const toReplace = {
                '–': '–',
                '”': '"',
                '„': '"'
            };
            for (let key in toReplace) {
                desc = desc.replace(key, toReplace[key]);
            }
            return desc;

Надеюсь, это поможет вам.

0 голосов
/ 27 июня 2018

Если вы попытаетесь заменить, используя строку, она заменит только первый экземпляр этой строки. Если вместо этого вы используете регулярное выражение, он заменит все совпадения этой строки. Это должно быть довольно просто, и регулярное выражение очень читабельно. Я бы сделал что-то вроде этого:

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

Я не проверял приведенный выше код, но суть его должна прекрасно работать в вашей функции. Если вы хотите расширить его, просто разверните массив замен.

0 голосов
/ 27 июня 2018

Это я думаю самый короткий. нет необходимости в цикле , вы можете использовать только replace()

Вы можете указать функцию в качестве второго параметра. В этом случае функция будет вызвана после выполнения матча.

как это:

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

Имейте в виду, что в этом выражении мы ищем точное совпадение –, ” и „, поэтому, если у вас выражение &#8222, не найдено совпадение.

0 голосов
/ 27 июня 2018

Вы можете использовать регулярное выражение со всеми соединенными ключами с конвейером (знак регулярного выражения для альтернативы) и использовать для замены функцию, которая принимает найденный ключ в качестве ключа для объекта замены.

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));
0 голосов
/ 27 июня 2018

Раствор 1

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

Решение 2

С повторением замен и заменой их с помощью .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));

Решение 3 (настраиваемые замены)

С присоединением к заменам и использованием функции замены:

.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, {
  '–': '–',
  '”': '"',
  '„': '"'
}));
...