regexp target last main li в списке - PullRequest
0 голосов
/ 08 июня 2010

Мне нужно указать начальный тег последнего верхнего уровня LI в списке, который может содержать или не содержать подсписки в различных позициях - без использования CSS или Javascript.

Есть ли простое / элегантное регулярное выражение, которое может помочь с этим? Я не гуру с ними, но появляется необходимость в жадных / не жадных селекторах, когда я выбираю все изменения среднего текста (. *) / (. +), Когда вложенные списки добавляются и перемещаются в список - и это сбивает меня с толку.

$pattern = '/^(<ul>.*)<li>(.+<\/li><\/ul>)$/';
$replacement = '$1<li id="lastLi">$3';

Может быть, есть более легкий подход? преобразование в XML для целевой LI, а затем преобразовать обратно?

т: Единственный элемент

<ul>
    <li>TARGET</li>
</ul>

Несколько элементов

<ul>
    <li>foo</li>
    <li>TARGET</li>
</ul>

Вложенные списки до конца

<ul>
    <li>
        foo
        <ul>
            <li>bar</li>
        </ul>
    <li>
    <li>TARGET</li>
</ul>

Вложенный список в конце

<ul>
    <li>foo</li>
    <li>
        TARGET
        <ul>
            <li>bar</li>
        </ul>
    </li>
</ul>

Ответы [ 3 ]

6 голосов
/ 08 июня 2010

Вы никогда не должны использовать регулярные выражения для анализа HTML .Особенно в данном конкретном случае (рекурсивные теги).

Основная причина в целом в том, что HTML не является обычным языком.

Вдобавок к тому факту, что HTML не является обычным языком и не может быть на 100% правильно проанализирован с помощью регулярных выражений, задача регулярного синтаксического анализа HTML «достаточно хорошо» достаточно сложна, чтобы вы с большей вероятностьючем не будет ошибок в вашем коде.

Вместо этого используйте указанный HTML-анализатор .

1 голос
/ 08 июня 2010

Преобразование XML и синтаксический анализ DOM - самый простой способ, если есть достаточная уверенность в том, какой тип данных HTML должен обрабатываться.

1 голос
/ 08 июня 2010

Используйте html-анализатор, а не регулярное выражение.

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