Превратите все слова внутри элемента DIV в идентификаторы для элемента SPAN

Что я хочу сделать, это повернуть это:

<DIV>One Two Three</DIV>

В это:

HTML

<DIV><SPAN id = "One"></SPAN><SPAN id = "Two"></SPAN><SPAN id = "Three"></SPAN></DIV>

CSS

#One { background-image: url('one.png'); }
#Two { background-image: url('two.png'); }
#Three { background-image: url('three.png'); }

У меня есть пара проблем. Во-первых, я знаю команду RegEx:

\b\w(.*?)+\b

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

(?<=>)\b\w(.*?)+\b(?=<)

Но в результате «Раз, два, три» превратился в единый матч.

Во-вторых, у меня есть этот код jQuery, который превратит мои критерии соответствия в идентификаторы SPAN.

$("DIV").each(function() {
    $(this).html($(this).html().replace(/\b\w(.*?)+\b/gi, "<SPAN id=\"$0\"></SPAN>"));
});

Но затем я нашел ответ Алекса Терпина на , заключающий каждое слово элемента в тег SPAN , и захотел применить это. Это почти сработало: я мог дать каждому слову в строке элемент SPAN, но это не сохраняло параметр id. Чего мне не хватает, чтобы все это работало?

ОБНОВЛЕНИЕ: Anant предоставил многообещающее решение в разделе комментариев. Во время моего теста я столкнулся со странной ошибкой, когда он подбирал все экземпляры строки-заполнителя, которая служила личным напоминанием о замене слова позже. Они выглядят так:

<DIV>
 <DIV class = "Something">One Two Three</DIV></DIV>
<DIV>
 <DIV class = "Something">TEMP</DIV></DIV>
<DIV>
 <DIV class = "Something">TEMP</DIV></DIV>

Когда код был применен, он превратился в это:

<DIV>
 <DIV class = "Something"><SPAN style = "background-image: url(one.png)"></SPAN><SPAN style = "background-image: url(two.png)"></SPAN><SPAN style = "background-image: url(threeTEMPTEMP.png)"></SPAN></DIV></DIV>
<DIV>
 <DIV class = "Something"><SPAN style = "background-image: url(one.png)"></SPAN><SPAN style = "background-image: url(two.png)"></SPAN><SPAN style = "background-image: url(threeTEMPTEMP.png)"></SPAN></DIV></DIV>
<DIV>
 <DIV class = "Something"><SPAN style = "background-image: url(one.png)"></SPAN><SPAN style = "background-image: url(two.png)"></SPAN><SPAN style = "background-image: url(threeTEMPTEMP.png)"></SPAN></DIV></DIV>

Эта ошибка была решена простым удалением всех следов слова TEMP из HTML. Вы также заметите, что код дублирует себя в каждом классе Something. Осталось только, чтобы код принимал каждый экземпляр класса Something по отдельности.

Я не знаю о RegEx, но, может быть, вы можете использовать это? textContent.trim().split(' ') затем для каждого элемента вы можете создать объект span и добавить его к <div>

alph 12.04.2023 05:13

Для решения Alex Turpin вам просто нужно добавить .attr("id", v) при создании диапазона. См.: jsfiddle.net/yr8wt0dg Если у вас не очень строгий/конкретный HTML, не используйте регулярное выражение. В вашем случае используйте .text() вместо .html().

freedomn-m 12.04.2023 07:41

Может быть полезно узнать, почему вы считаете, что вам нужно это сделать. Автоматически сгенерированные идентификаторы обычно никому не нужны; возможно, есть лучший способ сделать то, что, по вашему мнению, это решит (проблема XY).

freedomn-m 12.04.2023 08:05

Мне нужны идентификаторы, чтобы я мог связать их со свойством background-image. Каждое слово связано с файлом изображения (например, one.png для One). Я надеюсь, что этот метод избавит меня от необходимости копировать и вставлять несколько IMG в HTML.

Wammy 12.04.2023 08:11

Я бы предложил атрибут data-img='One', а не идентификатор (или, может быть, просто добавить в список классов). Решение будет таким же, но потенциально не будет генерировать повторяющиеся идентификаторы или недействительные идентификаторы.

freedomn-m 12.04.2023 08:15

Почти получилось. В первых двух случаях он получил их правильно. Третий добавил слово, откуда я понятия не имею. Ваш код близок. (Извиняюсь за задержку с ответом, нужно было убедиться, что это не было чем-то с моей стороны.)

Wammy 12.04.2023 09:09

Я знаю, почему это происходит. Итак, у меня есть несколько таких DIV в разных группах. В каждый DIV я добавил заполнитель в качестве напоминания о замене этого раздела позже. Оказывается, скрипт подобрал все экземпляры слова-заполнителя. Я обновлю основной пост, чтобы показать, что я имею в виду.

Wammy 12.04.2023 09:20

Вот обновленная скрипта с использованием примеров изображений (из другого поста SO): jsfiddle.net/e7o0vm1t

freedomn-m 12.04.2023 09:21

Что касается кода, работающего с большим количеством html, чем предполагалось, - это потому, что у вас есть $("div") - добавьте класс к div, к которому вы хотите применить (<div class='background'>), и измените js на $("div.background") (например) - так что это применимо только к выбранным вами div .

freedomn-m 12.04.2023 09:22
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
9
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам не хватает регулярного выражения, которое работает:

\S   # Match           non-whitespace characters.
+    #       1 or more

Кроме того, ваша строка замены должна использовать $&, а не $0:

<span id = "$&"></span>

Попробуйте на regex101.com.

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

\b      # Match a word boundary
\w      # then a word character ('a' to 'z', lower or uppercase, '-', or a digit),
(       # then           groups, each consists of
  .*?   #                                         0 or more characters,
)+      #      1 or more
\b      # then ends with another word boundary.

Попробуйте на regex101.com, чтобы увидеть разницу между ними.

Попробуй это:

$('div').each(function() {
  const currentHTML = $(this).html();
  const newHTML = currentHTML.replace(
    /\S+/g,
    '<span id = "$&"></span>'
  );
  
  console.info(currentHTML);
  console.info(newHTML);
  
  $(this).html(newHTML);
});
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div>One Two Three</div>
Ответ принят как подходящий

Примените дополнительный класс к элементам div, где вы хотите выполнить замену:

Проверьте ниже фрагмент кода:

$('div.modify-html').each(function() {
  var obj = $(this);
  var words = obj.text().split(" ");
  obj.empty();
  $.each(words, function(i, v) {
    var imgSrc = v.toLowerCase() + ".png";
    obj.append($("<span style='background-image: url(" + imgSrc + ");'>").text(v));
  });

});
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
  <div class = "something modify-html">One Two Three</div>
</div>
<div>
  <div class = "something">TEMP</div>
</div>
<div>
  <div class = "something">TEMP</div>
</div>
<div>
  <div class = "something modify-html">Four Five Six</div>
</div>

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