Добавить новый тег в середину элемента

Я пытаюсь окружить определенные слова в textContent тегами HTML, гипотетически это можно сделать, выполнив element.textContent = element.textContent.replaceAll("word", "<h1>word<h1>");, но это не анализируется, и element.innerHTML= element.innerHTML.replaceAll("word", "<h1>word<h1>"); не работает, потому что есть риск, что слово может быть именем тега. Есть ли какое-либо решение, кроме написания пользовательской функции замены, которая определяет наличие тега?

вы можете заранее проверить, окружено ли слово тегами через регулярное выражение. поймать только там, где слово не окружено < или >

Octavia Sima 07.05.2022 03:29

@OctaviaSima На самом деле это не работает, все еще существует риск того, что < или > не используются для обозначения тегов и могут быть удалены из слова, поскольку оно может быть переменной тега.

Aidan Welch 07.05.2022 03:32

Вероятно, вы могли бы написать сложное выражение регулярного выражения, но я чувствую, что в этот момент вам лучше написать менее сложную функцию для синтаксического анализа.

Aidan Welch 07.05.2022 03:33

@Spectric Выражение браузера, которому потребуется применить CSS и скрипты к определенным словам в существующих текстовых элементах.

Aidan Welch 07.05.2022 03:34

Хм, если это так, могли бы привести какой-то пример, который мы можем увидеть и их соответствующие выводы? также, если вы можете включить некоторые крайние случаи, это было бы здорово.

Octavia Sima 07.05.2022 03:35

@OctaviaSima Ну, вот один пример: <p class = "questions">What's your favorite class?</p> и это должно стать <p class = "questions">What's your favorite <custom-tag>class</custom-tag>?</p> Но станет <p <custom-tag>class</custom-tag> = "questions">What's your favorite <custom-tag>class</custom-tag>?</p> Что нарушит рендеринг HTML

Aidan Welch 07.05.2022 03:42

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

Octavia Sima 07.05.2022 04:05
Поведение ключевого слова "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
7
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете убедиться, что слово, которое вы пытаетесь дополнить, не находится внутри тега. Для этого нужно проверить окружающие его символы. Пока они не заключены в < и > с обеих сторон (или убедитесь, что они заключены в <some tag> слева и </?some tag> справа, как я сделал ниже), они должны быть единственными, которые нужно заменить. Попробуйте этот пример регулярного выражения ниже:

function padTags(content, openTag, word, closeTag) {
  console.info(content)
  const replacement = openTag + word + closeTag;
  const regex = `(?<!<[^<>]*)${word}(?![^<>]*>)`;
  const pattern = new RegExp(regex, 'g');
  return content.replace(pattern, replacement);
}

console.info(padTags(`<p class = "questions">What's your favorite class?</p>`, 
                '<custom-tag>', 'class', '</custom-tag>'));
console.info(padTags(`<div><p class = "test">class</p></div>`,
                '<custom-tag>', 'class', '</custom-tag>'));
console.info(padTags(`<div> class <p data-customvar = "<class>">This is my class </p>class</div>`,
                '<custom-tag>', 'class', '</custom-tag>'));

Это здорово, спасибо, но вот ошибка, которую я нашел <div><p class = "test">class</p></div>

Aidan Welch 07.05.2022 04:11

Кроме того, поскольку он требует, чтобы он был окружен тегами, я думаю, что следует использовать externalHTML вместо innerHTML, поскольку есть вероятность, что он не содержит тегов в innerHTML.

Aidan Welch 07.05.2022 04:12

Честно говоря, я думаю, что при подходе с регулярными выражениями всегда будут пограничные случаи из-за нерегулярной природы HTML.

Aidan Welch 07.05.2022 04:16

Извините за ошибку @AidanWelch, забыл добавить к нему другой тег, но он должен охватывать и этот случай после изменения регулярного выражения. Также превратил его в формат функции, чтобы вам было проще его повторно использовать и протестировать некоторые случаи, когда вы могли подумать, что это регулярное выражение не удастся.

Octavia Sima 07.05.2022 04:22

Хорошо, это почти идеально! И я думал, что это идеально, но я умею ломать вещи и обнаружил еще один пограничный случай: <div> class <p data-customvar = "<class>">This is my class </p>class</div> данные элемента могут вызвать проблемы с последующим сопоставлением слов. Кроме того, я просто использую regex101 для тестирования

Aidan Welch 07.05.2022 04:32

Привет, @AidanWelch, создал комнату для нас обоих, чтобы обсудить возможные крайние случаи, не могли бы вы проверить свои уведомления о чатах от меня?

Octavia Sima 07.05.2022 04:38

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