Как заменять слова/предложения между определёнными символами?

У меня есть такой код:

$('.create-block').children().eq(1).find('textarea').on('keyup', function (e) {
    inputArea = block.children().eq(1).find('textarea');
    outputArea = block.children().eq(1).find('.output-area');
    outputArea.html(inputArea.val().replace(/"([^"]+)"/g, '<strong>$1</strong>'));
})

Он позволяет мне изменять шрифт слов/предложений между кавычками на жирный, но как мне сделать сразу несколько замен, например:
слова/предложения между ' ' -> жирный текст
слова/предложения между " " -> курсивный текст
слова/предложения между ~ ~ -> курсивный жирный текст и т.д., т.е выполнять сразу все замены?


Ответы (1 шт):

Автор решения: DiD

Ну так и делать последовательно, по порядку.

$('p').each((i,p)=>$(p).html($(p).html()
   .replace(/\'[^\']+\'/g,`<b>$&</b>`)
   .replace(/\~[^\~]+\~/g,`<i><b>$&</b></i>`)
   .replace(/\"[^\"]+\"/g,`<i>$&</i>`)));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p>
'слова'/предложения 'между' -> 'жирный' текст
</p><p>
"слова"/предложения "между" -> "курсивный" текст
</p><p>
~слова~/предложения ~между~ -> ~курсивный~ жирный текст 
</p>

Еще можно с одним replace. Но это на любителя.

const repMap = [["'",['b']],['"',['i']],['~',['b','i']]];
$('p').each((i,p)=>{
let html = $(p).html();
for(const [s,r] of repMap)
   html=html.replace(
new RegExp(`\\${s}[^\\${s}]+\\${s}`,'g'),
`${r.map(r=>`<${r}>`).join``}$&${(r.reverse().map(r=>`</${r}>`).join``)}`);
$(p).html(html);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p>
'слова'/предложения 'между' -> 'жирный' текст
</p><p>
"слова"/предложения "между" -> "курсивный" текст
</p><p>
~слова~/предложения ~между~ -> ~курсивный~ жирный текст 
</p>

Или даже вот так. Но это тоже на любителя. Зато карта замены может быть безгранично большая - весь код написан.

/** Карта замен */
const repMap = [ [ "'", [ 'b'      ] ],
                 [ '"', [ 'i'      ] ],
                 [ '~', [ 'b', 'i' ] ] ];

/** Сразу построим список символов */
const symbs = repMap.map(([s,r])=>`${s}`).join``;

/* Для каждого <p> */
$('p').each((i,p)=>{
  /* заменяем innerHTML текущего тега <p> */
  $(p).html($(p).html().replace(   /* передаем replace() 2 параметра: */
    new RegExp(`([${symbs}])[^${symbs}]*[${symbs}]`,'g'), /* регулярку, */
    /* и функцию колбэк, которая отвечает за замену найденного выражения. */
    (found) => found.replace( /* Еще раз вызываем replace(), */
    /* но на этот раз регулярка будет содержать не список символов, а конкретный символ. */
     new RegExp(`\\${found[0]}([^\\${found[0]}]+)\\${found[0]}`,'g'), 
     /* Выражение замены состоит из тегов repMap.
        Если указано несколько тегов, например, ['b','i'], то выражение обрамится
        в <b><i> в начале выражения и </i></b> в конце выражения. */
     repMap.find(([c])=>c==found[0])[1].map(c=>`<${c}>`).join``+
     '$1'+ 
     repMap.find(([c])=>c==found[0])[1].reverse().map(c=>`</${c}>`).join``)));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p>
'слова'/предложения 'между' -> 'жирный' текст
</p><p>
"слова"/предложения "между" -> "курсивный" текст
</p><p>
~слова~/предложения ~между~ -> ~курсивный~ жирный текст 
</p>

→ Ссылка