[help] Выдрать текст из всё из определёных тегов

Статус
В этой теме нельзя размещать новые ответы.
было бы классно если бы еще объяснили какая логика(идея) работы этой части регулярного выражения:
PHP:
(?:(?R)|.)*?
в частности неизвестно ничего о (?R)


Рекурсивные шаблоны

Рассмотрим задачу поиска соответствия со строкой, находящихся внутри неограниченного количества круглых скобок. Без использования рекурсии лучшее, что можно сделать - написать шаблон, который будет решать задачу для некоторой ограниченной глубины вложенности, так как обработать неограниченную глубину не предоставляется возможным. В Perl 5.6 предоставлены некоторые экспериментальные возможности, которые в том числе позвояляют реализовать рекурсию в шаблонах. Специально обозначение (?R) используется для указания рекурсивной подмаски. Таким образом, приведем PCRE шаблон, решающий поставленную задачу (подразумевается, что используется модификатор PCRE_EXTENDED, незначащие пробелы игнорируются:( \( ( (?>[^()]+) | (?R) )* \)

Вначале он соответствует открывающей круглой скобке. Далее он соответствует любому количеству подстрок, каждая из которых может быть последовательностью не-скобок, либо строкой, рекурсивно соответствующей шаблону (т.е. строкой, корректно заключенной в круглые скобки). И, в конце, идет закрывающая круглая скобка.

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

Значение, устанавливаемое для захватывающей подмаски будет соответствовать значению, захваченному на наиболее глубоком уровне рекурсии. В случае, если приведенный выше шаблон сопоставляется со строкой (ab(cd)ef), захваченным значением будет 'ef', которое является последним значением, принимаемым на верхнем уровне. В случае, если добавить дополнительные скобки \( ( ( (?>[^()]+) | (?R) )* ) \), захваченным значением будет "ab(cd)ef". В случае, если в шаблоне встречается более, чем 15 захватывающих скобок, PCRE требуется больше памяти для обработки рекурсии, чем обычно. Память выделяется при помощи функции pcre_malloc, и освобождается соответственно функцией pcre_free. Если память не может быть выделена, сохраняются данные только для первых 15 захватывающих скобок, так как нет способа выдать ошибку out-of-memory изнутри рекурсии.

Для просмотра ссылки Войди или Зарегистрируйся
 
вот я для ЗАМЕНЫ в файлах с помощью регулярок пользуюсь программой AdvaSaR. а какой программой можно, как заявлено в этой теме "выдрать" нужную мне инфу. напр., мне нужно их 500 txt файлов СКОПИРОВАТЬ куски текста в новые файлы.
 
Был неправ насчет вложенных конструкций, со времени написания 2-ой книжки фридла кое-че поменялось. В PCRE возможна рекурсия регулярки. Вот так будет искать с учетом вложений.
PHP:
preg_match_all("{<table\s*(?:[a-z]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[a-z0-9_:.-]+))?\s*)*>(?:(?R)|.)*?</table\s*>}si",$text,$m);

Пробовал таким способом парсить хтмл, так скрипт вылетает: "Ошибка сегментирования", но это не во всех случаях... И в чем здесь дело? Непонятно...
 
помнится мне sjs парсер хорошо справлялся.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху