Регулярное выражение для замены строк на img - js

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

{"a":"img1.jpg", "ab":"img2.jpg"}

мое текущее регулярное выражение:

/(a|ab)/g

Когда у меня есть текст вроде:

yeah abc 

он заменяет "а" в "да" с img1.jpg, но также заменяет "ab"c на "img1.jpg".

Я могу избежать этого путем переключения /(ab|a)/, но это не может быть решением, так как у меня есть огромный несортированный список json в виде выражений (a, ab просто для простоты). Причина, по которой я делаю это, заключается в том, чтобы заменить собственные смайлики изображениями.

Как я могу сказать, что он заменяет только a, если за ним не следует b?

Просто сначала отсортируйте список, чтобы более длинные варианты были первыми.

CertainPerformance 25.02.2019 01:15

Или, если в строках нет пробелов и все они буквенно-цифровые, и вы хотите сопоставить их как целые слова, используйте /\b(a|ab)\b/

Wiktor Stribiżew 25.02.2019 01:16

что, если у меня есть больше, чем просто a,ab? как /(a|ab|ac|b|bc|)/. Мне как-то нужно обеспечить его уникальность @WiktorStribiżew

André 25.02.2019 01:28
/\b(a|ab|ac|b|bc)\b/ будет достаточно уникальным.
Wiktor Stribiżew 25.02.2019 01:29

@WiktorStribiżew, к сожалению, это не сработало, когда у меня были настоящие смайлики, такие как: /\b(?|?‍❤️‍?‍?)\b/ . они не узнаются в тексте...

André 25.02.2019 02:02

Они не будут распознаны, поскольку смайлики — это не буквы. Я бы никогда не стал предлагать границы слов, если бы вы сказали, что работаете с эмодзи.

Wiktor Stribiżew 25.02.2019 02:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
6
47
1

Ответы 1

Отсортируйте клавиши эмодзи в порядке убывания, а затем создайте шаблон регулярного выражения следующим образом:

function replaceEmojis (str) {
  const emojis = {
    a: { src: 'imgA.jpg', color: 'red' },
    abc: { src: 'imgABC.jpg', color: 'green' },
    ab: { src: 'imgAB.jpg', color: 'blue' },
    bc: { src: 'imgBC.jpg', color: 'orange' }
  };
  
  const fnDescendingOrder = ([x, y]) => x > y ? -1 : +(x != y);

  const keys = Object.keys(emojis).sort((x, y) =>
    fnDescendingOrder(x.length == y.length ? [x, y] : [x.length, y.length])
  );

  const pattern = new RegExp(keys.join('|'), 'g');

  const transformed = str.replace(pattern, m => {
    const emoji = emojis[m];
    return '<img class = "' + emoji.color + '" src = "' + emoji.src + '">';
  });

  return transformed;
};

let str = 'yeah abc ab a abca bcaba';
result.innerHTML = replaceEmojis(str);
img { width: 10px; height: 100%; }
img.red { background: red; }
img.green { background: green; }
img.blue { background: blue; }
img.orange { background: orange; }
<div id = "result"></div>

Вы должны отсортировать в порядке убывания сначала по длине, затем по алфавиту. Причина bc должна быть проверена после abc.

Я пытаюсь отсортировать его по атрибуту, а не по ключу, потому что у меня есть для него атрибут. Как я могу отсортировать объект объектов на основе свойства объектов? Например, сортировка по возрасту объекта: const arr = { a: { name: "Robin Van Persie", age: 28 }, b: { name: "Theo Walcott", age: 22 }, c: { name: "Bacary Sagna", age: 26 } }.sort(function(obj1, obj2) { return obj2.age - obj1.age; });

André 25.02.2019 02:46

@Андре. Функция sort взята из Array.prototype, для ее вызова вам нужно находиться в экземпляре массива. Сделайте это так: arr = Object.values(obj);, затем arr.sort((x, y) => x.age - y.age);

Washington Guedes 25.02.2019 08:10

Другие вопросы по теме