25.01.2024, 16:40
|
|
Профессор
|
|
Регистрация: 26.04.2011
Сообщений: 472
|
|
Написать регулярку
Есть строка вида
Код:
|
[shortcode]
<span>text</span> 123
<b>text 123 </b>
(любые символы, включая переносы, многократные переносы и html-код)
text <i>123</i>
text 123
[/shortcode]
[shortcode]
<span>text</span> 123
<b>text 123 </b>
(любые символы, включая переносы, многократные переносы и html-код)
text <i>123</i>
text 123
[/shortcode] |
И таких блоков с [shortcode]какой-то html[/shortcode] может быть много.
Нужна функция, которая строку между [shortcode] и [/shortcode] для каждого [shortcode] обернет в какой-то другой html, начало и конец которого нужно вывести в переменные.
1000р переводом
Последний раз редактировалось Viral, 25.01.2024 в 16:43.
|
|
25.01.2024, 17:04
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,753
|
|
Сообщение от Viral
|
обернет в какой-то другой html, начало и конец которого нужно вывести в переменные.
|
Не понятно. Пример можно? И что именно выводить в переменные?
|
|
25.01.2024, 17:12
|
|
Профессор
|
|
Регистрация: 30.04.2012
Сообщений: 3,018
|
|
const CODE_PATTERN = /\[([\w-]+)\]([\s\S]*?)\[\/\1\]/;
const handlerMap = {
shortcode: (content) => {
console.log(content);
return `<div class="foo">${content}</div>`;
},
};
function parseCode(value) {
let parsedValue = value;
while (CODE_PATTERN.test(parsedValue)) {
parsedValue = parsedValue.replace(CODE_PATTERN, (_matches, id, content) => {
const idLower = id.toLowerCase();
return handlerMap.hasOwnProperty(idLower) ? handlerMap[idLower](content) : content;
});
}
return parsedValue;
}
console.log(parseCode(sourceText));
|
|
25.01.2024, 17:18
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,131
|
|
Viral,
<!DOCTYPE HTML>
<html>
<head>
<title>Untitled</title>
</head>
<body>
<textarea id="txt" cols="30" rows="25">
[shortcode]
<span>text</span> 123
<b>text 123 </b>
(любые символы, включая переносы, многократные переносы и html-код)
text <i>123</i>
text 123
[/shortcode]
[shortcode]
<span>text</span> 123
<b>text 123 </b>
(любые символы, включая переносы, многократные переносы и html-код)
text <i>123</i>
text 123
[/shortcode]
</textarea>
<textarea id="out" cols="30" rows="25">
</textarea>
<script>
const reg = /\[shortcode\]([\s\S]*?)\[\/shortcode\]/gm;
const replace = (tag, endTag) => str => str.replace(reg, (_, html) => `${tag+html+endTag}`);
const withDiv = replace('<div style="color: red">', '<\/div>');
out.value = withDiv(txt.value);
</script>
</body>
</html>
|
|
25.01.2024, 17:19
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,753
|
|
Что мешает
str = str.replaceAll("[shortcode]", "что то в начале")
str = str.replaceAll("[/shortcode]", "что то в конце")
|
|
25.01.2024, 17:44
|
|
Профессор
|
|
Регистрация: 26.04.2011
Сообщений: 472
|
|
voraa,
Напиши в личку, куда денег кинуть
(ппц стыдоба, не допер до твоего варианта)
|
|
25.01.2024, 17:45
|
|
Профессор
|
|
Регистрация: 30.04.2012
Сообщений: 3,018
|
|
voraa, могут быть вложенные, нужно же контент правильно забрать.
|
|
25.01.2024, 17:47
|
|
Профессор
|
|
Регистрация: 30.04.2012
Сообщений: 3,018
|
|
Viral, а теперь попробуй сделать вложенные [shortcode]
Либо я не понял твою задачу
|
|
25.01.2024, 17:49
|
|
Профессор
|
|
Регистрация: 26.04.2011
Сообщений: 472
|
|
ruslan_mart,
С вложенными, вероятно, действительно не будет работать, но предполагается, что таких ситуаций не будет
|
|
25.01.2024, 18:07
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,753
|
|
Сообщение от ruslan_mart
|
voraa, могут быть вложенные, нужно же контент правильно забрать.
|
А что, надо вложенные изымать? И куда их выносить?
Там же все равно [shortcode] заменится на, скажем <div>, а [/shortcode] на </div>.
Ну будут вложенные дивы.
|
|
|
|