Модераторы: ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выделить тег с произвольным числом вложенных тегов 
:(
    Опции темы
barbiturat
Дата 28.12.2009, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 24.12.2009

Репутация: нет
Всего: нет



Как в приведенном примере найти <div class="someDiv"> со всем его содержимым при помощи одного регулярного выражения? Это вообще возможно?
Код

    <div class="someDiv">
        <div>...</div>
        <div>...</div>
        <div>
            <div>...</div>
        </div>
    </div>


Это сообщение отредактировал(а) barbiturat - 28.12.2009, 15:11
PM MAIL   Вверх
sir_nuf_nuf
Дата 28.12.2009, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 1
Всего: 31



Ага, возможно:


Код

my $html =<<HTML;
<html>
    <div class="someDiv">
        <div>...</div>
        <div>...</div>
    <br/>
    just a text
        <div>
            <div>...</div>
        </div>
    </div>
    <div>bu</div>
</html>
HTML


$html =~ m{<div[^>]+class="someDiv"[^>]*>             # your div
                (                                     # start recursion
                   (  
                        <\w+[^>]*/>                   # no body, like <br/>
                      | <(\w+)[^>]*>(?1)</\3[^>]*>    # tag with body
                      | [^<]*                         # plain text
                   )*                                 # one or more time
                )                                     # end recursion
           </div>}xs;                                 # be eXplained and Single line


print "found '$&'\n";



P.S. 
Да, такая регулярка поддерживает только xml - стиль - т.е. когда теги либо парные либо самозакрывающиеся. Распарсить старый html типа <b><i></b></i> или <br> не получится.

Это сообщение отредактировал(а) sir_nuf_nuf - 28.12.2009, 16:31


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
n4n0bit
Дата 28.12.2009, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 19.6.2008

Репутация: нет
Всего: 1



PM MAIL WWW Jabber   Вверх
barbiturat
Дата 29.12.2009, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 24.12.2009

Репутация: нет
Всего: нет



sir_nuf_nuf, спасибо! Дома попробую.
А что значит (?1)?

Добавлено через 4 минуты и 20 секунд
n4n0bit, мне это нужно для использования не на perl, а на JavaScript. К сожалению, конструкции RegExp на JavaScript-форумах обсуждаются крайне редко, вот и запостил вопрос сюда smile Просто в JavaScript язык регекспов практически полностью совпадает с таковым в perl (хотя в перле и есть свои уникальные конструкции, но их, слава богу, я совсем редко наблюдаю)
PM MAIL   Вверх
DurRandir
Дата 29.12.2009, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 2
Всего: 17



(?1) - это рекурсивный матчинг внутри регулярки (матчит часть этого же самого регулярного выражения рекурсивно, для произвольной вложенности внутренних тегов). Без этого расширения (классическими регулярками) эта задача нерешаема.

Это сообщение отредактировал(а) DurRandir - 29.12.2009, 09:01
PM   Вверх
sir_nuf_nuf
Дата 29.12.2009, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 1
Всего: 31



Цитата(barbiturat @  29.12.2009,  02:30 Найти цитируемый пост)
мне это нужно для использования не на perl, а на JavaScript

А сразу написать было не судьба ?

(?1) - это означает, что на данном месте нужно опять начать применять кусок регулярки начинаемый в первой (1) группе (круглой скобочек). Рекурсивная регулярка - нововведение perl,
в JavaScript такого нет. 


Зато в JS все решается вообще без регулярок:
Код

alert(document.getElementsByClassName('someDiv')[0].innerHTML;

Правда, здесь только содержимое этого дива.. ну да ладно.

Это сообщение отредактировал(а) sir_nuf_nuf - 29.12.2009, 12:29


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
amg
Дата 29.12.2009, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: нет
Всего: 50



Цитата(sir_nuf_nuf @  29.12.2009,  12:23 Найти цитируемый пост)
(?1) - это означает, что на данном месте нужно опять начать применять кусок регулярки начинаемый в первой (1) группе (круглой скобочек). Рекурсивная регулярка - нововведение perl
В perl 5.10? То то я смотрю, незнакомая конструкция. А ведь логично и изящно! В старом perl рекурсия регэкспов реализовывалась иначе. Пора переходить на 5.10...

PM MAIL   Вверх
sir_nuf_nuf
Дата 29.12.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 1
Всего: 31



Цитата(amg @  29.12.2009,  15:00 Найти цитируемый пост)
В perl 5.10? 

Ага.. с удивлением обнаружил, что только в 5.10.  В 5.8.8 - нет.


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




[ Время генерации скрипта: 0.0753 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.