За последние 24 часа нас посетил 17981 программист и 1644 робота. Сейчас ищут 1304 программиста ...

Помогите с выражением! Запарился!!!!

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

  1. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    Вобщем есть таблица на сайте. Надо выдрать только её.
    PHP:
    1.  
    2. preg_match('@(<table width=\"640\" border=\"0\" align=\"center\" cellpadding=\"2\" cellspacing=\"0\" class=\"tableline_99_tb\" style=\"margin:10 0 10 0;\">)ЗДЕСЬ НУЖНО ПРОПИСАТЬ КОД ДЛЯ ЛЮБОГО СИВОЛА - НЕ ЗНАЮ КАК(</a>[[:space:]]\n*[[:space:]]*</td>\n*[[:space:]]*</tr>\n*[[:space:]]*</table>)@i',$content,$matches); $content=$matches['0'].$matches['2'].$matches['1'];
    3.  
    Т.Е. нам известны статичные данные -
    то начало таблицы (всё работает) и конец этой таблицы (тоже работает), но вот как прописать то что между ними? а в середине таблицы любые данные - абсолютно. Какоей есть универсальный символ для регулярки? А то все нереально описать (по крайней мере у меня нихрена не выходит).
    ПОМОГИТЕ!!!!!!!!
     
  2. Nick0

    Nick0 Активный пользователь

    С нами с:
    26 июл 2008
    Сообщения:
    55
    Симпатии:
    0
    (.*)

    Вот пример :

    preg_match('/<!-- content -->(.*)<!-- \/content -->/s', $data[$z], $m)

    Вырезает между <!-- content --> и <!-- \/content -->
    значение берёт из переменной $data[$z] и записывает в $m
     
  3. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    Спасибо.

    Чё-то не догнал.

    preg_match('/<table width=\"640\" border=\"0\" align=\"center\" cellpadding=\"2\" cellspacing=\"0\" class=\"tableline_99_tb\" style=\"margin:10 0 10 0;\">(.*)</a>[[:space:]]\n*[[:space:]]*</td>\n*[[:space:]]*</tr>\n*[[:space:]]*</table>/s',$content,$matches); $content=$matches['0'].$matches['2'].$matches['1'];

    ТАК?

    Warning: preg_match(): Unknown modifier 'a' in y:\home\test.ru\www\files\name.php on line 13

    Notice: Undefined index: 0 in y:\home\test.ru\www\files\name.php on line 13

    Notice: Undefined index: 2 in y:\home\test.ru\www\files\name.php on line 13

    Notice: Undefined index: 1 in y:\home\test.ru\www\files\name.php on line 13
     
  4. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    Блин и так не пашет

    preg_match('/<table width=\"640\" border=\"0\" align=\"center\" cellpadding=\"2\" cellspacing=\"0\" class=\"tableline_99_tb\" style=\"margin:10 0 10 0;\">(.*)<\/a>[[:space:]]\n*[[:space:]]*<\/td>\n*[[:space:]]*<\/tr>\n*[[:space:]]*<\/table>/s',$content,$matches); $content=$matches['0'].$matches['2'].$matches['1'];
     
  5. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    В принципе так пашет:

    preg_match('/<table width=\"640\" border=\"0\" align=\"center\" cellpadding=\"2\" cellspacing=\"0\" class=\"tableline_99_tb\" style=\"margin:10 0 10 0;\">.*/s',$content,$matches); $content=$matches['0'].$matches['2'].$matches['1'];


    Только ограничения нет в конеце поэтому много невидимого барахла осталяет что конечно не есть гуд.
     
  6. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    А ИЛИ т.е. | работает в регулярке как-то не так??

    Ставлю

    preg_match('/<table width=\"640\" border=\"0\" align=\"center\" cellpadding=\"2\" cellspacing=\"0\" class=\"tableline_99_tb\" style=\"margin:10 0 10 0;\"> | <table width=\"540\" border=\"0\" align=\"center\" cellpadding=\"2\" cellspacing=\"0\" class=\"tableline_99_tb\" style=\"margin:10 0 10 0;\"> .*/s',$content,$matches); $content=$matches['0'].$matches['2'].$matches['1'];

    УЖЕ НЕ РАБОТАЕТ. Почему?
    Спасибо!
     
  7. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    Возможно налету заменять один элемент из регулярки? У меня всё записывается так $content=$matches['0']; (возвращает целое значение регулярки), а есть ещё $matches['5']; - там цифры. Мне нужно прибавить к цифре 10 и запустить в целое значение, т.е. заменить в $matches['0']; только $matches['5']=$matches['5']+10; и чтобы т.е. целое значение $matches['0'] уже выдавало замененое значение $matches['5'].
    Такое возможно? Если да, то как?!
    Огромное спасибо!
     
  8. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    :(
    никто не знает?
     
  9. obsrv

    obsrv Активный пользователь

    С нами с:
    2 окт 2008
    Сообщения:
    238
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Обязательно регуляркой решить эту задачу ?
    Входящая строка какой может иметь вид : искомая table может быть посередине, какой уникальный атрибут ее характеризует (если всередине) ?
    Выдрать надо с первого <tr> по последний или чтобы и <table> входила ?
    Текст должен быть сохранен или могут появиться закрывающие </tr>, если их не было - критично ?
     
  10. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    Не обязательно решить регуляркой. Просто иной способ мне в данном случае не известен. Нужно выдрать таблицу с сайта (вернее всегда выдирать), и там в одном столбце есть цифры, которые нужно мне изменить +10, и чтобы в каждой ячейки этого столбца нужная цифра увеличивалась на 10.
    В том то и дело что до echo $matches['0']; нужно чтобы $matches['5']; = $matches['5']+10;
    Только ничего не получается. Если я плюсую $matches['5']+10; и echo $matches['5']; данная выходит только последняя, а не все, да и ктомуже как вставить их в $matches['0']; ???

    Вот вся задача.

    Можно тут что-нибудь решить?
    Спасибо!
     
  11. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
  12. obsrv

    obsrv Активный пользователь

    С нами с:
    2 окт 2008
    Сообщения:
    238
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Ход мысли:
    Код (Text):
    1.  
    2. $str = "bla-bla";  // строка с таблицей.
    3. $doc = new DOMDocument();
    4. $doc->loadHTML($str);
    5. $tables = $doc->getElementsByTagName('table');
    6. $node = $tables->item(0);
    7. echo $doc->saveHTML();
    Если таблица будет не одна, то перебирать их ориентируясь на аттрибуты.
    Тут ман по DOM поможет .
     
  13. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    Ничего не ясно. Сайт тот кстати отношения к xml не имеет. А как этот DOM решает проблему не разобрался. Ваш код вставил и получил ответ Fatal error: Cannot instantiate non-existent class: domdocument in ...
     
  14. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    А регуляками всё же реально выполнить такую задачу????
     
  15. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    решил зациклить регулярку в надежде на то, что вытянет все цены из одной колонки

    PHP:
    1. $pwa = 1;
    2. while ($pwa <= 25) {
    3. preg_match('/(<td width=\"70\" align=\'right\'><strong><a href=\'\/fold_ru\/choose_this)(.*)(class=\"mall_list_link\">)(.*)(<\/a><\/strong><\/td>)/s',$content,$matches1);
    4. $price=$matches1['4'];
    5. print ("$price");
    6. $pwa++;
    7. }
    в конечном итоге зацикливает только одну цену:) причём самую последнюю.
    Подскажите пожалуйста как правильно сделать. Я не понимаю почему выдирает только 1 цену! Там ведь ячейки по формату не отличаются, потому регулярка проходит по этой формулеровке.
    ПОМОГИТЕ!!!!!!!!
     
  16. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    Я вообще туда рою? Подскажите что я напутал
    Спасибо!
     
  17. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    Стоп. А можно как-нибудь с preg_replace это реализовать?
    Если да то как? Как с этой функцией оперировать с числами (суммировать число +10)
    ??
     
  18. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    Блин, программеры! Вы что на форуме делаете??!!
     
  19. obsrv

    obsrv Активный пользователь

    С нами с:
    2 окт 2008
    Сообщения:
    238
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Ну пока все программеры спят, может потратите время на то, как "DOM решает проблему" ;)
    А чтобы не было фаталов - надо почитать ман и подключить нужные библиотеки (возможно хватит правки php.ini)
     
  20. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    :(

    http://ru2.php.net/dom там всё на инглише
    Посоветуйте пожалуйста литературу на русском.
     
  21. Frozen

    Frozen Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
    есть ли у таблицы id или класс за который можно зацепиться?

    можно будет так

    preg_match('#id="id"[^>]*>(.+)</table>#Usi', $content, $matches);

    print_r($matches);

    далее
    preg_match_all('#<td>(.+)</td>#Usi',$content, $matches);

    а то что никто не помогает - просто за 1 пост всю тему регулярок не объясниш
     
  22. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    так что именно использовать, preg_match или preg_match_all, или оба сразу?
    Идеи немного не понял!
     
  23. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    айди есть, но проблема в том что они эти айди не по порядку и совершенно различны, и их нужно сначала также выдрать чтобы сюда подставить.
    Собственно что говорить, вот как выглядет всё на примере одной строки:

    HTML:
    1.  
    2. <tr bgcolor="#F3F3F3" style='cursor:hand' onMouseOver="this.style.backgroundColor='#FFD2D2'" onMouseOut="this.style.backgroundColor='#F3F3F3'">    <td width="95" align="center" ><div style="width:64px" class="box20"><a href='/fold_ru/choice/view_detail.jsp?id=5687425' class="list_link"><img src='/42716897677_011.jpg' width='64' height='40' border='0' ></a></div></td>    <td ><a href='/fold_ru/choice/view_detail.jsp?id=5687425' class="list_link"> Rare</a></td>    <td ><a href='/fold_ru/choice/view_detail.jsp?id=5687425'  class="list_link">New Hill</a></td>    <td width="50" align="right" ><a href='/fold_ru/choice/view_detail.jsp?id=5687425'  class="list_link">A/T</a></td>    <td width="40" align="center" class="list_link"><a href='/fold_ru/choice/view_detail.jsp?id=5687425' class="list_link">2007</a></td>    <td width="55" ><a href='/fold_ru/choice/view_detail.jsp?id=5687425'  class="list_link">Silver</a></td>    <td align='right' ><a href='/fold_ru/choice/view_detail.jsp?id=5687425'  class="list_link">11,734</a></td>    <td width="70" align='right'><strong><a href='/fold_ru/choice/view_detail.jsp?id=5687425'  class="list_link"> 12,718</a></strong></td>    <td  align='center' width="80" ><a href='/fold_ru/choice/view_detail.jsp?id=5687425'><img src="expected.gif" width="49" height="11" border=0></a></td>
    3.   </tr>
    4.  
     
  24. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    Соответственно цена в той ячейке, в которой сейчас 12,718
    На страницы всего по 25 строк
     
  25. Frozen

    Frozen Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
    preg_match_all('#<strong>[^>]+\D*([\d,]+)\D*</a>#si', $var, $matches);


    если совсем все тяжко скинь в личку сайт и что вытянуть