Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Помогите с регулярным выражением


Автор: vpokorp 9.2.2008, 05:28
Есть файл - из него надо по  preg_match_all($pattern, $content, $out);  вытащить переменные в массив.
Никак не могу составить выражение для $pattern чтобы все заработало - где ошибка?

Опыта у меня с ними немного - так что сильно не бейте.
Если поможете - буду Вас вспоминать

Цитата

   <TD width="100%">
            <TABLE class=post cellSpacing=0 cellPadding=0 border=0>
              <TBODY>
              <TR>
                <TD><A 
                  href="http://www.domen.ru/agent?message&amp;to=darya-82@dron.ru"><IMG 
                  class=dog1 height=13 src="2.files/status.domen.gif" width=13 
                  align=absMiddle border=0></A> </TD>
                <TD><SPAN class=author><A 
                  href="http://domen.ru/dron/darya-82/">Дарья 
                  Спирина
</A></SPAN> </TD>
                <script>document.write('<td><img src=http://img.domen.ru/1.gif width=4 height=1><a onclick="return userMenuShow(this, event,1)" href="#url?to=darya-82@dron.ru@dron" target="_blank"><img border=0 src="http://help.domen.ru/js/user_arrow_pas.gif" width="13" height="13" alt="Меню пользователя" title="Меню пользователя" align="absmiddle"></a> &nbsp; </td>');</SCRIPT>

                <TD><A 
                  href="http://my.domen.ru/my/friendship?to=darya-82%40dron.ru" 
                  target=_blank><IMG title="мой самый" height=16 
                  alt="Добавить в друзья" src="2.files/ico_addfriend.gif" 
                  width=16 align=absMiddle border=0></A>&nbsp;<A class=t75 
                  href="http://my.domen.ru/my/friendship?to=darya-82%40dron.ru" 
                  target=_blank>Хороша</A> </TD></TR></TBODY></TABLE>
            <H1 class="orange mb2 mt5" id=questext><INDEX>Заголовок текста
            Просто текст
</INDEX></H1>
            <TABLE class="post mb15" cellSpacing=0 cellPadding=0 width="100%">
              <TBODY>
              <TR>
                <TD vAlign=top><SPAN class="tah t70 grey3"><IMG title=открыт 
                  height=16 alt=открыт src="2.files/ico_status_A.gif" width=16 
                  align=absMiddle> Русский текст </SPAN><!--/td>
        <td class=buts width=120--><A 
                  class="t70 orange tah" 
                  href="http://domen.ru/sms/12825370/"><IMG class=ico13 
                  height=17 alt="молодец" src="2.files/ico_star.gif" 
                  width=17 align=absMiddle border=0>Хорошая</A> 
              </TD></TR></TBODY></TABLE>
            <DIV class="t75 mb20"><INDEX>Текст, 
            Длинный длинный текст 
            Очень длинный текст
.</INDEX> 



В массив нужно затащить пять подсвеченных значений. Три первых получается, а дальше - хоть тресни

Для первых трех подходит
Код

$pattern = "/author[^\/]+\/([^\/]+)\/([^\/]+)\/[^>]+>([^<]+)</";




Для 5-х думал подойдет:

Код

$pattern = "/author[^\/]+\/([^\/]+)\/([^\/]+)\/[^>]+>([^<]+)<i*mb2[^>]+>[^>]+>([^<]+)<i*mb2[^>]+>[^>]+>([^<]+)</";



Но увы - ничего не находит. В чем я туплю?

Автор: SelenIT 9.2.2008, 06:03
Насколько я понял, нужно вытащить ссылку с пометкой "автор" (адрес и содержимое) + содержимое тегов INDEX (в заголовке и в div-е)?

В первом приближении такое срабатывает:
Код

$pattern = '~<SPAN class=author><A[^>]*href="http://[\w.]+/(.*?)"[^>]*>(.*?)</A></SPAN>.*?<H1[^>]*><INDEX>(.*?)</INDEX></H1>.*?<DIV[^>]*><INDEX>(.*?)</INDEX>~si';


Нужные фрагменты будут в "карманах" с первого по четвертый. Только путь из ссылки я бы брал целиком, а потом разбирал с помощью explode - а то есть ли гарантия, что там всегда будут два "каталога"?

Автор: vpokorp 10.2.2008, 02:38
Спасибо - работает smile
Но почему-то неожиданно долго - 3 секунды на локалке - для сравнения мой код для поиска 3-х первых элементов срабатывает за доли секунды.
В связи с этим продолжаю спрашивать:
Что за модификатор в конце "si" - без него почему-то вообще не находит.
Из-за чего возникает задержка со временем.
Файл в котором ведется поиск порядка 60 кб

И еще - как обозначается  "вхождение любого количества ЛЮБЫХ знаков", включая переводы строки и прочие

Автор: vpokorp 10.2.2008, 22:51
Код

$pattern = "/author[^\/]+\/([^\/]+)\/([^\/]+)\/[^>]+>([^<]+)<.*?<index>(.*?)<\/index>.*?<index>(.*?)<\/index>/ims";


так заработало и быстренько

спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)