Сделайте XML-теги явно близкими с помощью JavaScript - PullRequest
0 голосов
/ 13 мая 2019

У меня есть строка с тегами xml:

<strong><em>Some text</em> more text</strong>

Мне нужно, чтобы она выглядела так:

<strong><em>Some text</em></strong> <strong>more text</strong>

Другими словами, мне нужно явное закрытие каждого тега.

другой пример:

<em>Another <strong>line <u>of text</u> etc.</strong> more text</em>

должен выглядеть так:

<em>Another</em> <em><strong>line</strong></em> <em><strong><u>of text</u></strong></em> <strong>etc.</strong> <em>more text</em>

Есть ли способ сделать это с помощью javascript или jquery?Нужен ли для этого плагин?

В системе, над которой я работаю, я конвертирую несколько тегов в отдельные теги, например, <i><b> станет <ib>, а <u><i><b> станет <uib>.Это необходимо для будущего импорта в InDesign, который только «понимает» прямые элементы HTML - <tag>string</tag> - он не распознает теги внутри тегов.Поэтому мне нужно преобразовать внутренние теги xml в плоскую структуру.

Я пробовал регулярные выражения, циклы и т. Д., Но каждый раз это слишком сложно и не охватывает каждый сценарий.

1 Ответ

0 голосов
/ 14 мая 2019

Это можно сделать с 3 петлями.Первый цикл разбивает исходную строку на теги.

var strArr = xml.split (/(<[^<]+?>[^<]+?(?=<))/), newArr = [];

for (var i = 0; i < strArr.length; i++ ) {
    if (strArr [i] != '')
        newArr.push (strArr [i]);
}

Второй цикл добавляет незакрытые теги к каждой строке в порядке их появления в исходной строке.

for (var i = 0; i < newArr.length; i++ ) {
    if (newArr [i].match (/<[^\/]/)) {
        var tag = newArr [i].match (/<[^\/<]+?>/) [0];
        for (var j = i+1; j < newArr.length; j++ ) {
            if (!newArr [j].match (new RegExp (tag.replace (/</, '</'))) && !newArr [j].match (tag) && !newArr [j].match (/<\//)) {
                var t_str = newArr [j].split (/(<[^<]+?>)/);
                var xml_elem = '';
                for (var k = 2; k < t_str.length; k ++) {
                    xml_elem += t_str [k]
                }
                newArr [j] = t_str [1] + tag + xml_elem;
            } else if (newArr [j].match (new RegExp (tag.replace (/</, '</')))) {
                tag = '';
            }
        }
    }
}

Третий цикл добавляет закрывающие теги ккаждая строка в обратном порядке.

for (var i = newArr.length - 1; i > -1 ; i-- ) {
    var comp_str = newArr [i].replace (/<\/[^<]+?>/g, '');
    if (comp_str.match (/<[^<]+?>/)) {
        var reverse_tags = comp_str.match (/<[^<]+?>/g).reverse ().join ('').replace (/</g, '</');
        newArr [i] = comp_str + reverse_tags;
    } else if (comp_str != ''){
        newArr [i] = comp_str;
    }
    if (comp_str.replace (/<[^<]+?>/g, '') == '') {
        newArr.splice (i, 1);
    }
}

Вот, пожалуйста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...