Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Блок текста, содержащий теги <a ....>, <img...> и <br />
Форумы портала PHP.SU » PHP » Регулярные выражения » Блок текста, содержащий теги <a ....>, <img...> и <br />

Страниц (1): [1]
 

1. hippp - 26 Июня, 2010 - 18:14:24 - перейти к сообщению
Нужно вытащить блок многострочного текста между любыми двумя тегами. При этом этот текст может содержать в себе теги <a ....>, <img...> и <br />. Их надо вытащить вместе с текстом.

Вот пример (то что нужно вытащить помечено красным):

<div>Первая строка<br />
Вторая строка<br />
<a href="http://www.ooo.ru> Слово </a>
<img src="http://www.ooo.ru>
Последняя строка
</div>

Я написал выражение, но оно не захватывает все, что надо. Вы не могли бы подправить его:

#>(?: ((?!>)|<a[^>]*>|</a>|<img[^>]*>|<br />).)+<#mUsi
2. sozdatel - 26 Июня, 2010 - 18:58:23 - перейти к сообщению
Я напишу позже своё решение этого вопроса, делал вчера тоже самое и получилось =) Радость а если хочешь сам посмотри функцию http://www[dot]poiu[dot]ru/functions/ind[dot][dot][dot]eg-match-all[dot]htm

PHP:
скопировать код в буфер обмена
  1. preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",
  2.     "<b>example: </b><div align=left>this is a test</div>",
  3.     $out, PREG_PATTERN_ORDER);
  4. print $out[0][0].", ".$out[0][1]."\n";
  5. print $out[1][0].", ".$out[1][1]."\n"

Этот пример выведет:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <b>example: </b>, <div align=left>this is a test</div>
  2. example: , this is a test

Таким образом, $out[0] - массив из строк, соответствующих всему шаблону, а $out[1] содержит массив строк, заключенных между тегами.

Мне это помогло и всё получилось как нужно.
3. JustUserR - 26 Июня, 2010 - 19:07:43 - перейти к сообщению
hippp пишет:
Я написал выражение, но оно не захватывает все, что надо. Вы не могли бы подправить его:
Если у вас внутри тега не содержится вложенных тегов с таким же именем то достаточно просто использовать шаблон с нежадными квантификаторами или модификатором /U - иначе как вариант можно обработать строку с помощью рекурсивной функции и дать каждому из тегов уникальный номер типа tag[N] с соответствующей шифровкой - после чего уже можно проводить полноценный разбор регулярными выражениями
Функция просмотра вперед и назад конечно являются полезными - но по умолчанию не применяются для рекурсивной обработки произольных вложенных тегов - только со специальной функцией обратного вызова
4. hippp - 28 Июня, 2010 - 16:52:37 - перейти к сообщению
sozdatel пишет:
Я напишу позже своё решение этого вопроса, делал вчера тоже самое и получилось

Sozdatel, если не сложно, поделись своим решинием плиз. Пересмотрел кучу всего, но пока не выходит то, что нужно.
5. JustUserR - 28 Июня, 2010 - 16:58:05 - перейти к сообщению
hippp пишет:
Пересмотрел кучу всего, но пока не выходит то, что нужно.
Если у вас не имеется вложенных тегов то достаточно простого нежадного квантификатора - можно использовать ранжированные нежадные квантификаторы типа {A,B}? для указания минимальной и макисмальной длины выбираемого фрагмента текста
6. Joo - 30 Июня, 2010 - 10:58:30 - перейти к сообщению
hippp пишет:
Sozdatel, если не сложно, поделись своим решинием плиз. Пересмотрел кучу всего, но пока не выходит то, что нужно.

Где то в соседней теме я выкладывал пример парсинга блоков, с вложенными тегами.
7. JustUserR - 01 Июля, 2010 - 00:57:41 - перейти к сообщению
Joo пишет:
Где то в соседней теме я выкладывал пример парсинга блоков, с вложенными тегами.
Данный вопрос обсуждался в одной из тем по регулярным выражениям и конечное решение было предложено автором здесь http://forum.php.su/topic.php?fo...88036#1276788036
Однако в исходной задаче требуется выборка из содержимого тегов <div> простого текста и некоторого ограниченного набора тегов - часть из которых не может быть вложенными в принципе поскольку они являются самозакрывающимися тегами а другие попросту не используются в такой схеме Поэтому для решения в данном случае можно использовать обычный нежадный шаблон регулярного выражения для выборки текста - и удаления всех остальные тегов вторичным регуляным выражением или функцией strip_tags

 

Powered by ExBB FM 1.0 RC1