Javascript-форум (https://javascript.ru/forum/)
-   Работа (https://javascript.ru/forum/job/)
-   -   Написать регулярку (https://javascript.ru/forum/job/85724-napisat-regulyarku.html)

Viral 25.01.2024 16:40

Написать регулярку
 
Есть строка вида
Код:

[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р переводом

voraa 25.01.2024 17:04

Цитата:

Сообщение от Viral
обернет в какой-то другой html, начало и конец которого нужно вывести в переменные.

Не понятно. Пример можно? И что именно выводить в переменные?

ruslan_mart 25.01.2024 17:12

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

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>

voraa 25.01.2024 17:19

Что мешает
str = str.replaceAll("[shortcode]", "что то в начале")
str = str.replaceAll("[/shortcode]", "что то в конце")

Viral 25.01.2024 17:44

voraa,
Напиши в личку, куда денег кинуть
(ппц стыдоба, не допер до твоего варианта)

ruslan_mart 25.01.2024 17:45

voraa, могут быть вложенные, нужно же контент правильно забрать.

ruslan_mart 25.01.2024 17:47

Viral, а теперь попробуй сделать вложенные [shortcode] :)

Либо я не понял твою задачу

Viral 25.01.2024 17:49

ruslan_mart,
С вложенными, вероятно, действительно не будет работать, но предполагается, что таких ситуаций не будет

voraa 25.01.2024 18:07

Цитата:

Сообщение от ruslan_mart
voraa, могут быть вложенные, нужно же контент правильно забрать.

А что, надо вложенные изымать? И куда их выносить?
Там же все равно [shortcode] заменится на, скажем <div>, а [/shortcode] на </div>.
Ну будут вложенные дивы.


Часовой пояс GMT +3, время: 12:42.