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

Тема в разделе "Регулярные выражения", создана пользователем Ser Frood, 11 окт 2008.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. Ser Frood

    Ser Frood Заблокирован

    Регистр.:
    12 дек 2006
    Сообщения:
    519
    Симпатии:
    384
    Подскажите плз регулярочку чтоб выдрать например всё содержимое из тэга <table> </table>!

    И ещё как например выдрать адрес рисунка с такими парамертрами:

    blabla.ru/zzz/111/{ТУТ РАНДОМ ЦИФРЫ}.png

    где blabla.ru/zzz/111/ обезательны!
     
  2. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Для второго:
    Код:
    blabla\.ru/zzz/111/(\d+)\.png
    Для первого, в общем случае нельзя создать такую регулярку. Если внутри тега нет такого же вложенного тега, то подойдет регулярка
    Код:
    <table>.*?</table>
    Если же есть вложенные теги, то можно сделать регулярку только для неболее определенного уровня вложенности (можно создать и автоматом, по переменной n к примеру). Конструкции произвольной вложенности же можно искать только для Perl и .NET Для остальных языков искать конструкции произвольной вложенности с помощью одних регулярок нельзя.
     
  3. Ser Frood

    Ser Frood Заблокирован

    Регистр.:
    12 дек 2006
    Сообщения:
    519
    Симпатии:
    384
    Во вложении есть есть теги:
    <TABLE cellSpacing=0 cellPadding=0 width=750 border=0>
    <TBODY>
    <TR>
    <TD class=tracker_log...........
    </table>
     
  4. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Если есть такие же вложенные теги, тогда проблемно сделать.
    т.е. например
    <table>
    <tr><td>
    <table>......</table>
    </td></tr>
    </table>
    Если нет, то подойдет, только для произвольного тега с атрибутами регулярка чуть усложняется
    Код:
    <table(?:\s+[a-z]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[a-z0-9_:.-]+))?\s*)*\s*>.*?</table\s*>
     
  5. Ser Frood

    Ser Frood Заблокирован

    Регистр.:
    12 дек 2006
    Сообщения:
    519
    Симпатии:
    384
    Делую так preg_match_all("<table\s*(?:[a-z]+(?:\s*=\s*(?:\"[^\"]*\"|'[^']*'|[a-z0-9_:.-]+))?\s*)*>.*?</table\s*>",$text,$m);

    preg_match_all() [function.preg-match-all]: Unknown modifier '.' in
     
  6. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    preg_match_all("{<table(?:\s+[a-z]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[a-z0-9_:.-]+))?\s*)*\s*>.*?</table\s*>}is",$text,$m);
     
  7. Ser Frood

    Ser Frood Заблокирован

    Регистр.:
    12 дек 2006
    Сообщения:
    519
    Симпатии:
    384
    всё пашет на ура! ток получиллсся двойной масив! так и долно быть?
    Array ( [0] => Array ( [0] => text
    ) )
     
  8. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Ага, первый индекс- номер совпадения, второй для выбора части совпадения, индекс 0 означает все совпадение.
    Если использовать preg_match, массив будет только один, с первым совпадением.
     
  9. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Был неправ насчет вложенных конструкций, со времени написания 2-ой книжки фридла кое-че поменялось. В PCRE возможна рекурсия регулярки. Вот так будет искать с учетом вложений.
    PHP:
    preg_match_all("{<table\s*(?:[a-z]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[a-z0-9_:.-]+))?\s*)*>(?:(?R)|.)*?</table\s*>}si",$text,$m);
     
    Ser Frood нравится это.
  10. painsource

    painsource Постоялец

    Регистр.:
    13 июл 2009
    Сообщения:
    64
    Симпатии:
    8
    было бы классно если бы еще объяснили какая логика(идея) работы этой части регулярного выражения:
    PHP:
    (?:(?R)|.)*?
    в частности неизвестно ничего о (?R)
     
Статус темы:
Закрыта.