регулярное выражение, чтобы найти идентификатор тега и содержание JavaScript - PullRequest
5 голосов
/ 17 июля 2010

Эй, я пытаюсь сделать что-то совершенно определенное с регулярным выражением в javascript, и мой регулярный выражение в лучшем случае является shakey Интересно, есть ли какие-нибудь профессионалы, которые могли бы указать мне правильное направление. Итак, у меня есть текст ...

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

... и т.д.

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

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

Ответы [ 4 ]

7 голосов
/ 17 июля 2010

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

  • Соответствует начальному и конечному именам элементов тега
  • Извлечь значение атрибута 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];
}

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

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

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

1 голос
/ 21 января 2016

Если кому-то действительно нравится или нужно использовать Regex для получения тега HTML по идентификатору (как в теме вопроса), он может использовать мой код:

function GetTagByIdUsingRegex(tag,id,html) {
    return new RegExp("<" + tag + "[^>]*id[\\s]?=[\\s]?['\"]" + id + "['\"][\\s\\S]*?<\/" + tag + ">").exec(html);
}

Я также сделал один, чтобы получить элемент по имени класса:

function GetTagByClassUsingRegex(tag,cls,html) {
    return new RegExp("<" + tag + "[^>]*class[\\s]?=[\\s]?['\"]" + cls + "[^'\"]*['\"][\\s\\S]*?<\/" + tag + ">").exec(html);
}
0 голосов
/ 17 июля 2010

Это строка 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 голосов
/ 17 июля 2010

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

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];
    }
}
...