Как заменить вхождения с Javascript внутри разделителей?

1

Как заменить все вхождения, которые находятся в пределах двух символов. Пример:

I love :octocat: beach and you do :joy: not like it

Замените URL-адрес, который будет создан на основе того, что внутри разделителей

I love [img of octocat] beach and you do [img of joy] not like it

Javascript необходимо запечатлеть, что внутри: и заменить

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

Теги:

3 ответа

2
Лучший ответ

К счастью для вас String.prototype.replace принимает RegExp и функцию. Итак, в вашем примере вы можете написать регулярное выражение, чтобы найти строки между двумя символами и заменить их.

RegEx для вашего примера, использующего двоеточия, просто будет /:(.*?): /g, и вы могли бы делать все, что захотите, в своей функции, например, заменить строку на строку + дополнительные символы. например

var str = "I love :octocat: beach and you do :joy: not like it"
str = str.replace(/:(.*?):/ig, function (str){
  return str + 'BLAHBLAHBLAH'
})

Значение str теперь "I love :octocat:BLAHBLAHBLAH beach and you do :joy:BLAHBLAHBLAH not like it", забавный материал, а?

  • 0
    Это то, что мне было нужно! Спасибо, мой друг!
  • 0
    Не беспокойся, береги человека
1

Используйте String.replace с функцией обратного вызова, запрашивающей карту {'pattern': 'replacement'}:

let str = 'I love :octocat: beach and you do :joy: not like it';

let replacements = {
  'octocat': '[img of octocat]',
  'joy': '[img of joy]'
};

let result = str.replace(/:(\w+):/g, (match, word) => replacements[word]);
console.log(result);
0

Shrtfrm:

"I love :octocat: beach and you do :joy: not like it".split(":").map((el,i)=>i%2===0?el:{"octocat":"hello","joy":"test"}[el]||el).join("");

Просто разделите, замените и присоединитесь снова.

http://jsbin.com/moxexilica/edit?console

Объяснение:

.split(":")
//returns: ["I love ","octocat"," beach and you do ","joy"," not like it"]
.map((el,i)=>i%2===0?el
//leave the strings outside (indexes 0,2,4) as they are
:el{"octocat":"hello","joy":"test"}[el]
//replace the others (indexes 1,3) with the value in the object so:
// octocat => hello
//joy => test
||el
//if it does not exist e. g. ':test:' fall back to 'test'
//now weve got:
//["I love ","hello"," beach and you do ","test"," not like it"]
.join("")
//a string

Выделено для функции:

function replace(str,replacer){
  return str.split(":").map((el,i)=>i%2===0?el:replacer[el]||el).join("");
}

Таким образом, вы можете:

alert(replace("I love :octocat: beach and you do :joy: not like it", {octocat:"manly",joy:"not"}));

С изображениями:

document.body.innerHTML=replace(document.body.innerHTML, {octocat:"<img src='octocat.png' />",joy:"<img src='joy.png' />"});

Обратите внимание, что ":" не является хорошим delemiter. Вы можете использовать более необычный вариант, например, %% или !!...

  • 0
    Это невероятно сложно поддерживать и много жестко, я не думаю, что это хороший ответ на этот вопрос.
  • 0
    @jdmdevdotnet почему? Вы можете переместить объект замены из него и поместить его в функцию?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню