Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Пятничная задачка по regexpr / 10 сообщений из 10, страница 1 из 1
21.10.2016, 11:24
    #39331338
TREY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задачка по regexpr
есть текст
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<div id=1>
    <div id=2>
        <div id=3>
            <div id=4>
              <div id=8> </div><div id=9> </div>

            <div id=9>
            </div>
            </div>
        </div>
    </div>
    <div id=5>
        <div id=6>
        </div>
    </div>
    <div id=7>
    </div>
</div>


В самих div может быть абсолютно разный вложенный контент .

Задача - вернуть все возможные div блоки с 1,2,3,4,5 и тд вложениями div ,
только у блоков могут быть id или class , а могут не быть , в примере id для наглядности ..
...
Рейтинг: 0 / 0
21.10.2016, 15:36
    #39331692
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задачка по regexpr
TREY, в чем трудность? Линейный тривиальный алгоритм, либо я вас плохо понял
...
Рейтинг: 0 / 0
21.10.2016, 16:59
    #39331800
TREY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задачка по regexpr
SashaMercury,

regexpr
...
Рейтинг: 0 / 0
21.10.2016, 20:09
    #39331912
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задачка по regexpr
Эту задачу невозможно решить на регулярных выражениях.
В RE нету возможности учитывать количество открывающих-закрывающих скобок. Это уже задача для парсера умеющего разбирать бесконтекстную грамматику.
...
Рейтинг: 0 / 0
22.10.2016, 15:08
    #39332124
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задачка по regexpr
1. Из мэйнстримных языков мне не известен тот, который не умеет сейчас работать с xml
2. Даже если не умеет, решается набором простых действий вроде таких:
- найти все открывающие и закрывающие тэги
- рекурсивная функция, которая формирует многоуровневый массив из полученного массива тэгов, проваливаясь глубже (в новосозданный элемент), когда видит открывающий тэг, и поднимаясь на уровень выше, когда видит закрывающий тэг

Чистой регуляркой не реализуемо, потому как она линейна, а не рекурсивна. То есть задачу с помощью одних регулярок (без вспомогательных функций) можно решить, но только если множество раз запускать функцию поиска и замены (по сути тот же второй вариант, только более запутанно и сложно)
...
Рейтинг: 0 / 0
22.10.2016, 19:56
    #39332166
TREY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задачка по regexpr
White OwlЭту задачу невозможно решить на регулярных выражениях.
не верю вам..


Програмёр1. Из мэйнстримных языков мне не известен тот, который не умеет сейчас работать с xml
хтмл != xml


ПрограмёрЧистой регуляркой не реализуемо, потому как она линейна, а не рекурсивна.
как раз читаю про рекурсивные регулярки


Програмёрможно решить, но только если множество раз запускать функцию поиска и замены (по сути тот же второй вариант, только более запутанно и сложно)
это первое что пришло мне в голову , но не могу выбрать тег див в котором нету дивов .. То есть выбирать дивы у которых нету вложения, добавлять их в массив , и удалять из текста , а потом снова искать , добавлять и удалять , пока не будет равно нулю ..
...
Рейтинг: 0 / 0
22.10.2016, 20:31
    #39332180
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задачка по regexpr
TREYWhite OwlЭту задачу невозможно решить на регулярных выражениях.
не верю вам..


Програмёр1. Из мэйнстримных языков мне не известен тот, который не умеет сейчас работать с xml
хтмл != xml


ПрограмёрЧистой регуляркой не реализуемо, потому как она линейна, а не рекурсивна.
как раз читаю про рекурсивные регулярки


Програмёрможно решить, но только если множество раз запускать функцию поиска и замены (по сути тот же второй вариант, только более запутанно и сложно)
это первое что пришло мне в голову , но не могу выбрать тег див в котором нету дивов .. То есть выбирать дивы у которых нету вложения, добавлять их в массив , и удалять из текста , а потом снова искать , добавлять и удалять , пока не будет равно нулю ..

Коллега, HTML = XML... Очень даже равно :)
HTML это частный случай XML. И кстати под прасинг именно HTML тоже много чего написано готового. На каком языке пишите? Возможно смогу помочь в поисках нужного готового функционала

Насчёт рекурсивных регулярок.... кхм... Теперь мне ещё больше захотелось узнать на чём Вы пишите. Потому как мне неизвестны случаи реализации рекурсивных регулярок "из коробки".

Насчёт запуска регулярки рекурсивно - это забивание гвоздей ковшом бульдозера! Вы представляете какие будут расходы у Вас на это дело?

В общем, как уже писал, лучше скажите на чём задачу решаете , а я постараюсь помочь с поиском нужных библиотек для работы с DOM
...
Рейтинг: 0 / 0
22.10.2016, 20:55
    #39332191
TREY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задачка по regexpr
Програмёр,

delphi xe4, там есть инди и другое , я вкурсе
...
Рейтинг: 0 / 0
24.10.2016, 11:14
    #39332588
F#
F#
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задачка по regexpr
Програмёр
Коллега, HTML = XML... Очень даже равно :)
HTML это частный случай XML.

Нет XHTML это частный случай XML.
HTML это частный случай SGML.

Например в HTML можно не закрывать теги (<br>), а в xhtml нельзя - только <br/>
...
Рейтинг: 0 / 0
24.10.2016, 14:36
    #39332784
TREY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задачка по regexpr
че то мозгов не хватило рекурсивную регулярку написать , по этому решил послушать @Програмёр , сделал через IHtmlElement.

Может кому то пригодиться , выводит все div в TStringlist:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
function GetContent(inp: string; tegname: string): TStringlist;
var
  Document: IHTMLDocument2;
  Cache: string;
  V: OleVariant;
  i: Integer;
  Tags: IHTMLElementCollection;
  Tag: IHtmlElement;
  body: IHTMLElement2;
begin
  result := TStringlist.Create;
  Cache := inp;
  Document := coHTMLDocument.Create as IHTMLDocument2;
  V := VarArrayCreate([0, 0], varVariant);
  V[0] := Cache;
  Document.write(PSafeArray(TVarData(V).VArray));
   if not Supports(Document.body, IHTMLElement2, body) then
    raise Exception.Create('Can''t find <body> element');
  Tags := body.getElementsByTagName(tegname);
  for i := 0 to Tags.length - 1 do
  begin
    Tag := Tags.item(i, EmptyParam) as IHtmlElement;
    result.Add(Tag.innerHTML)
  end;
end;

procedure Taf.Button63Click(Sender: TObject);
begin
  memo2.lines.Text := GetContent(memo.lines.Text, 'div').Text;
end;
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Пятничная задачка по regexpr / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]