Мои навыки регулярного выражения не так высоки, поэтому я заранее извиняюсь, если мой вопрос кого-то беспокоит.
Я пытаюсь преобразовать строку двумя способами
первый способ работает отлично и выглядит следующим образом:
var string = "User template user info: {{userFirstname}} - {{userLastname}}";
var text = string
.replace(/\{{/g, "<span class='label label-danger' contenteditable='false' style='padding: 6px; color: #FFFFFF; font-size: 16px;'>")
.replace(/\}}/g, "<span contenteditable='false' class='remove-tag fa fa-times'></span></span> ");
второй способ не работает, и я не могу понять причину:
var text = 'User template user info: <span class="label label-danger" contenteditable="false" style="padding: 6px; color: #FFFFFF; font-size: 16px;">userFirstname<span contenteditable="false" class="remove-tag fa fa-times"></span></span> - <span class="label label-danger" contenteditable="false" style="padding: 6px; color: #FFFFFF; font-size: 16px;">userLastname<span contenteditable="false" class="remove-tag fa fa-times"></span></span>
var string = text
.replace(/<span class='label label-danger' contenteditable='false' style='padding: 6px; color: #FFFFFF; font-size: 16px;'>/g, "{{")
.replace(/<span contenteditable='false' class='remove-tag fa fa-times'><\/span><\/span> /g, "}}")
Я ценю, если кто-нибудь скажет мне, что мне не хватает. заранее спасибо
В то время как простая замена, основанная на заполнитель, часто работает, замена сложных HTML-элементов легко сбой с регулярным выражением.
Я бы рекомендовал здесь другой подход!
Верхний подход дает вам контроль над тем, какие элементы вы хотите устранить и которые необходимо сохранить. Нижний подход разделяет весь HTML и предполагает, что вы знаете содержание span
.
var text = 'User template user info: <span class="label label-danger" contenteditable="false" style="padding: 6px; color: #FFFFFF; font-size: 16px;">userFirstname<span contenteditable="false" class="remove-tag fa fa-times"></span></span> - <span class="label label-danger" contenteditable="false" style="padding: 6px; color: #FFFFFF; font-size: 16px;">userLastname<span contenteditable="false" class="remove-tag fa fa-times"></span></span> '
function replaceSpan(text)
{
//convert text into virtual DOM object
var div = document.createElement("div");
div.insertAdjacentHTML("afterbegin", text);
//loop over children and replace
Array.prototype.forEach.call(div.querySelectorAll("span"), function(element){
if (element.contentEditable == "false" && element.classList.contains("label") && element.classList.contains("label-danger") )
{
elementContent = element.textContent;
element.parentNode.replaceChild(document.createTextNode("{{"+elementContent+"}}"), element);
}
});
console.log(div.textContent);
return div.textContent
}
replaceSpan(text);
Также это может быть упрощено:
var text = 'User template user info: <span class="label label-danger" contenteditable="false" style="padding: 6px; color: #FFFFFF; font-size: 16px;">userFirstname<span contenteditable="false" class="remove-tag fa fa-times"></span></span> - <span class="label label-danger" contenteditable="false" style="padding: 6px; color: #FFFFFF; font-size: 16px;">userLastname<span contenteditable="false" class="remove-tag fa fa-times"></span></span> '
var string = document.createElement("div");
string.innerHTML = text;
// use textContent of div element to return text without HTML
string = string.textContent.replace("userFirstname", "{{userFirstname}}")
.replace("userLastname", "{{userLastname}}");
console.log(string);
Значение replace имеет свои значения атрибутов, заключенные в одинарные кавычки contenteditable='false'
, в то время как значение свойства text
имеет свои значения атрибутов, заключенные в двойные кавычки contenteditable="false"
. Это заставляет замену не находить указанную строку из-за несоответствия котировок.
В text
переменной также отсутствует закрывающая '
// replace now searching with " instead of '
var text = 'User template user info: <span class="label label-danger" contenteditable="false" style="padding: 6px; color: #FFFFFF; font-size: 16px;">userFirstname<span contenteditable="false" class="remove-tag fa fa-times"></span></span> - <span class="label label-danger" contenteditable="false" style="padding: 6px; color: #FFFFFF; font-size: 16px;">userLastname<span contenteditable="false" class="remove-tag fa fa-times"></span></span> '
var string = text
.replace(/<span class="label label-danger" contenteditable="false" style="padding: 6px; color: #FFFFFF; font-size: 16px;">/g, "{{")
.replace(/<span contenteditable="false" class="remove-tag fa fa-times"><\/span><\/span> /g, "}}")
Я считаю, что это своего рода обходной путь, но он работает для меня
var string = text
.replace(/<span[^>]*>/g, "{{")
.replace(/<\/span[^>]*>/g, "")
.replace(/{{ /g, "}}");
contenteditable='false'
, а значение свойстваtext
имеет значения атрибута, заключенные в двойные кавычкиcontenteditable="false"
. Это приводит к тому, что замена не находит указанную строку из-за несоответствия кавычек.