RegExp в Javascript для группировки элементов по категориям

Мне нужно реализовать RegExp в Javascript, который позволяет мне сопоставлять следующие категории и элементы, связывая элементы с их правильной категорией, но я не знаю, как это сделать:

<table>
    <tbody>
        <tr>
            <td>
                <a href="mycategory1.asp">text</a>
            </td>
        </tr>
</tbody>
</table>
<div>
    <table>
        <tbody>
            <tr>
                </td>
                    <a href="myitem1.asp">text</a>
                <td>
            </tr>
            <tr>
                </td>
                    <a href="myitem2.asp">text</a>
                <td>
            </tr>
            <tr>
                </td>
                    <a href="myitem3.asp">text</a>
                <td>
            </tr>
            .....................
        </tbody>
    </table>
</div>
<table>
    <tbody>
        <tr>
            <td>
                <a href="mycategory2.asp">text</a>
            </td>
        </tr>
</tbody>
</table>

У меня может быть более 10 категорий, и я не знаю, сколько предметов будет в каждой категории. Я мог бы легко создать регулярное выражение, которое соответствует мне по категориям, а другое — по элементам, но как я могу создать связь между ними?

Спасибо и всего наилучшего,

Ливио


person liv913    schedule 27.11.2010    source источник


Ответы (2)


Не читайте HTML с помощью регулярных выражений. Дайте таблицам классы, а затем прочитайте их с обходом DOM. HTML-код должен выглядеть так:

<table class="caption">
    <tbody>
        <tr>
            <td>
                <a href="mycategory1.asp">text</a>
            </td>
        </tr>
    </tbody>
</table>
<div>
    <table class="itemlist">
        <tbody>
            <tr>
                </td>
                    <a href="myitem1.asp">text</a>
                <td>
            </tr>
            <tr>
                </td>
                    <a href="myitem2.asp">text</a>
                <td>
            </tr>
            <tr>
                </td>
                    <a href="myitem3.asp">text</a>
                <td>
            </tr>
            .....................
        </tbody>
    </table>
</div>
<table class="caption">
    <tbody>
        <tr>
            <td>
                <a href="mycategory2.asp">text</a>
            </td>
        </tr>
    </tbody>
</table>
...

Затем составьте их список следующим образом:

var captions = document.getElementsByClassName("caption");
var itemlists = document.getElementsByClassName("itemlist");
var items = new Array();
for (var i=0; i<captions.length; i++) {
 var categoryLink = captions[i].getElementsByTagName("a")[0];
 var categoryItems = itemlists[i].getElementsByTagName("a");
 for (int j=0; j<categoryItems.length; j++) {
  items.push({"itemname":categoryItems[j].innerHTML,
              "itemurl":categoryItems[j].href,
              "categoryname":categoryLink.innerHTML,
              "categoryurl":categoryLink.href});
 }
}
person thejh    schedule 27.11.2010
comment
Я определенно на стороне сторонников парсера в этом вопросе. Вот почему я был разочарован, прочитав, что @liv913 сообщает, что фактический HTML не может быть проанализирован доступными классами синтаксического анализа. - person tchrist; 27.11.2010

Регулярные выражения не панацея от всех проблем. RegEx создан для сопоставления текста с использованием шаблонов. ИМХО эту проблему лучше решать с помощью любого парсера XML.

person Teja Kantamneni    schedule 27.11.2010
comment
Учитывая, что ей нужно решить проблему в javascript и это HTML, возможно, не XHTML, это, вероятно, не вопрос XML-парсера. Но ваша точка зрения о регулярном выражении остается в силе. - person Orbling; 27.11.2010
comment
Я пытался использовать анализатор XML, но кажется, что эта страница неправильно сформирована и не позволяет ее анализировать... - person liv913; 27.11.2010
comment
@liv913: Жаль это слышать; это реальное соображение, которое исключает возможность чистого решения. Известно, что синтаксические анализаторы HTML/XML менее либеральны, чем настоящие браузеры. Разрешающие браузеры причинили миру вред во имя добра. - person tchrist; 27.11.2010