Вот что-то такое придумал:
const initialStr = 'Lorem ipsum <strong>dolor</strong> sit amet'
const toItalic = 'ipsum dolor'
const result = italic(initialStr, toItalic)
console.log(result)
function italic(str, toReplace) {
const reWithTags = new RegExp(
toReplace.replace(
/\w+$|^\w+|\w+\s+/g,
m => '(<.*?>)?' + m + '(<.*?>)?'
)
)
return str.replace(reWithTags, m => '<i>' + m + '</i>')
}
В общем работает это так:
- Создаём новое регулярное выражение из строки которую мы должны изменить. (Каждое слово оборачивается в
(<.*?>)?СЛОВО(<.*?>)?
, то-есть оно может быть окружено в какой-то тег)
- Далее мы заменяем строку у слов, у которых может быть тег, на строку, окружённую в нужный там тег (в данном случае
<i>
).
Стоит отметить что это будет работать только с английским текстом, для русского текста нужно составлять другое выражение, вот такое:
/[А-ЯЁа-яё]+$|^[А-ЯЁа-яё]+|[А-ЯЁа-яё]+\s+/g
Можно немного изменить функцию и сделать её применение более широкой:
const initialStr = 'Lorem ipsum <strong>dolor</strong> sit amet'
const toReplaceStr = 'ipsum dolor'
const initialStrRu = 'Лорем ипсум <strong>долор</strong> сит амет'
const toReplaceStrRu = 'ипсум долор'
const result = envelopInTag(initialStr, toReplaceStr, 'i')
const resultRu = envelopInTag(initialStrRu, toReplaceStrRu, 'i')
console.log(result)
console.log(resultRu)
function envelopInTag(str, toReplace, tagName) {
const reWithTags = new RegExp(
toReplace.replace(
/[А-ЯЁа-яёa-zA-Z]+$|^[А-ЯЁа-яёa-zA-Z]+|[А-ЯЁа-яёa-zA-Z]+\s+/g,
m => '(<.*?>)?' + m + '(<.*?>)?'
)
)
return str.replace(reWithTags, m => `<${tagName}>` + m + `</${tagName}>`)
}