Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Парсинг собственных тегов (https://javascript.ru/forum/misc/37317-parsing-sobstvennykh-tegov.html)

nixml 15.04.2013 15:47

Парсинг собственных тегов
 
есть некая строка, например:
var string = "
начало строки 
[tag=tagname1]text1[/tag]
середина
[tag=tagname2]text25text[/tag]
 конец";

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

если не использовать дополнительные атрибуты тегов, то доступ к содержимому можно получить следующим кодом:
var g = '[tag]1[/tag][tag]2[/tag]';
var q = g.match(/\[tag\](\n|\r|.)*?\[\/tag\]/g);
alert(q);

на выходе имею нужный мне массив
дальше я делаю .replace(/\[\/?tag\]/g, '')
но появилась задача отличать между собой содержимое одинаковых тегов, введя дополнительный атрибут.

и тут появилась проблема поиска еще одного вхождения, а именно атрибута тега
если чуть изменить регулярку, на
/\[tag=(.*)\](\n|\r|.)*?\[\/tag\]/g

то в результате я получаю строку [tag=tagname1]text1[/tag]середина[tag=tagname2]text25text[/tag]
таким образом регулярка захватывает лишние данные и все ломается
что мне нужно изменить, может почитать, чтобы починить свой код?

Aetae 15.04.2013 16:11

/\[tag=([^\]]*)\]([\S\s])*?)\[\/tag\]/g

nixml 15.04.2013 18:01

Только это все не то. Вхождения то я не получаю в результате.

SV0L0CH 15.04.2013 18:18

можно разбить на фрагменты и по ним построить дерево, приблизительно это можно сделать так:
alert(JSON.stringify("начало[tag=tagname1]text1[/tag]середина[tag=tagname2]text2[/tag]конец".split(/(?=\[.*?\])|(?=\])/)));

Можно так же воспользоваться решениями типа этого https://github.com/Svoloch/js-text-tools
Только сразу предупреждаю, это будет не в пользу быстродействия.


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