Я создаю приложение с текстовой областью, требующей форматирования. Я не хочу использовать div contenteditable, поэтому я думаю, что следующим лучшим решением будет использовать обычное текстовое поле и впоследствии заменить символы тегом.
Форматирование аналогично Reddit или Slack ..
$( '.actionBtn' ).on('click', function(){
var cursorPos = $('#text').prop('selectionStart');
var cursorPosEnd = $('#text').prop('selectionEnd');
var v = $('#text').val();
var textBefore = v.substring(0, cursorPos );
var textSelected = v.substring( cursorPos, cursorPosEnd );
if (textSelected == "") {
textSelected = "text here"
}
var textAfter = v.substring( cursorPosEnd, v.length );
$('#text').val( textBefore + $(this).val() + textSelected + $(this).val() + textAfter );
});
$( '#submitBtn' ).on('click', function(){
//TODO: switch to tags
// * becomes <b></b>
// _ becomes <i></i>
// #c# becomes <span class = "myClass"> </span>
$('#result').html($('#text').val())
});.myClass {
color: #FF0;
}<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form>
<div>
<textarea id = "text" cols = "40" rows = "3"></textarea>
</div>
<div>
<input class = "actionBtn" type = "button" value = "*" />
<input class = "actionBtn" type = "button" value = "_" />
<input class = "actionBtn" type = "button" value = "#c#" />
</div>
<div>
<input id = "submitBtn" type = "button" value = "Submit" />
</div>
<p id = "result">
</p>
</form>Итак, из этого примера, когда нажимается Submit, мне понадобятся:
* becomes <b></b>
_ becomes <i></i>
#c# becomes <span class = "myClass"> </span>
Как я мог это сделать? Спасибо



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете легко заменить четные / нечетные вхождения строки в строке регулярными выражениями. Например:
const regex = /\_(.*?)\_/gm;
const str = `Lorem _ipsum_ dolor sit amet, _consectetur adipiscing_ elit, sed
do _eiusmod_ tempor `;
const subst = `<em>$1</em>`;
// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);
console.info('Substitution result: ', result);
Паттерн m здесь бесполезен. Экранирование подчеркиваний не требуется. Вместо использования ленивого квантификатора используйте класс символов с отрицанием. Этот ответ учит исследователей методам плохого регулярного выражения. Этот ответ не будет правильно анализировать _shut the _____ door_.
Это делает больше:
var tags = {
"*": ["<b>", "</b>"],
"_": ["<span class='myClass'>", "</span>"]
}
var el = document.getElementById("editor"),
val = htmlize(el.value),
display = document.getElementById("display");
display.innerHTML = val;
el.addEventListener("change", function(){
val = htmlize(el.value);
display.innerHTML = val;
});
function htmlize(content){
for(var i in tags){
var reg = "\\"+i+"\\s?(\\w+)";
reg = new RegExp(reg, "g");
content = content.replace(reg, function(match, w){
return tags[i][0]+w+tags[i][1];
});
}
return content;
}<textarea id = "editor">
I'm so great * awesome dude and _ fantastic person. You * Should know this
</textarea>
<p id = "display"></p>Я обвиняю ОП в том, что они не ясно изложили свои требования, но этот ответ не ведет себя так, как принятый ответ. Этот ответ будет заключать в тег только первую подстроку «слова», которая следует за специальным символом. Я сохраню желание ответить на этот вопрос до тех пор, пока вопрос не будет прояснен.
Поскольку вы не включили минимальный воспроизводимый пример, эта страница получила два ответа, которые делают разные вещи. Пожалуйста, улучшите этот неясный вопрос, предложив подходящую сложную входную выборку и точный желаемый результат.