regex для нахождения идентификатора тега и содержания JavaScript

Эй я пытаюсь сделать, что-то довольно определенное с regex в JavaScript и моем regexp-нечто является шатким в лучшем случае Заданный вопросом, если были какие-либо профессионалы там, которые могли бы указать на меня в правильном направлении. Таким образом, у меня есть некоторый текст...

<item id="myid1">myitem1</item>
<item id="myid2">myitem2</item>

... и т.д.

И я хотел бы разделить его в массив, который читает myid1, myitem1, myid2, myitem2.... и т.д.

Никогда не будет вложенных элементов, таким образом, не будет никакой рекурсивной вложенной проблемы. Кто-либо, который в состоянии колотить это быстро?Спасибо за помощь!

5
задан Darin Dimitrov 17 July 2010 в 10:20
поделиться

3 ответа

Вот регулярное выражение, которое будет:

  • Сопоставить имена элементов начального и конечного тега
  • Извлечь значение атрибута id
  • Извлечь внутреннее HTML-содержимое тега

Примечание: Я поленился сопоставить здесь значение атрибута. Его нужно заключить в двойные кавычки, и не должно быть пробелов между именем атрибута и его значением.

<([^\s]+).*?id="([^"]*?)".*?>(.+?)</\1>

Выполнение регулярного выражения в javascript будет выполняться следующим образом:

search = '<item id="item1">firstItem</item><item id="item2">secondItem</item>';
regex = new RegExp(/<([^\s]+).*?id="([^"]*?)".*?>(.+?)<\/\1>/gi);
matches = search.match(regex);
results = {};
for (i in matches) {
    parts = regex.exec(matches[i]);
    results[parts[2]] = parts[3];
}

В конце этого результатов будет объект, который выглядит так:

{
    "item1": "firstItem",
    "item2": "secondItem"
}

YMMV, если элементы содержат вложенные HTML.

7
ответ дан 14 December 2019 в 04:29
поделиться

Я всегда использую этот сайт для создания своих регексов:

http://www.pagecolumn.com/tool/regtest. htm

Вот регекс, который я придумал:

(<[^>]+>)([^<]+)(<[^>]+>)

И вот результат, который страница выдает мне для JavaScript

Использование объекта RegExp:

var str = "<item id="myid1">myitem1</item><item id="myid2">myitem2</item><ssdad<sdasda><>dfsf";
var re = new RegExp("(<[^>]+>)([^<]+)(<[^>]+>)", "g");
var myArray = str.match(re);

Использование литерала:

var myArray = str.match(/(<[^>]+>)([^<]+)(<[^>]+>)/g)

if ( myArray != null) {
    for ( i = 0; i < myArray.length; i++ ) { 
        var result = "myArray[" + i + "] = " + myArray[i];
    }
}
0
ответ дан 14 December 2019 в 04:29
поделиться

Это строка XML. На мой взгляд, лучше всего подходит для такого рода задач парсер XML . Сделайте следующее:

var items = document.getElementsByTagName("item") ; //<> use the parent element if document is not
var dataArray = [ ] ;

for(var n = 0 ; n < items.length ; n++) {

     var id = items[n].id ;
     var text = items[n].childNodes[0] ;

         dataArray.push(id,text) ;

}

Если ваша проблема в том, что вы не можете преобразовать строку xml в объект xml, вам придется заранее использовать парсер DOM :

var xmlString = "" ; //!! your xml string
var document = null ;

    if (window.ActiveXObject) { //!! for internet explorer

            document = new ActiveXObject("Microsoft.XMLDOM") ;
            document.async = "false" ;
            document.loadXML(xmlString) ;

    } else { //!! for everything else

        var parser = new DOMParser() ;
            document = parser.parseFromString(xmlString,"text/xml") ;

    }

Затем используйте приведенный выше сценарий.

0
ответ дан 14 December 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: