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


Автор: K0r0l 27.5.2008, 23:32
записи в таблице забиты следующим образом, и хотелось бы с помощью regexp`а разделить 4 крайних td на 4 переменных, сложность заключается в том что хотя эти числа и имеют стандартный вид x,xxxx но иногда вместо числа ничего нету...
Код

<td>some constant text</td>
<td></td>
<td>1,000</td>
<td>0,944</td>
<td>0,351</td>
<td>0,999</td>


мучался мучался но само регулярное выражения для такого случая как-то не получается написать
Код

/(?<=<td>some\sconstant\stext<\/td>\s<td><\/td>\s)(<td>\d\,\d{3}<\/td>){4}(?=<\/td>)/

такое вот не работает =(



Автор: gta4kv 27.5.2008, 23:50
а почему бы не сделать:

Код

$str = <<<STR
<td>some constant text</td>
<td></td>
<td>1,000</td>
<td>0,944</td>
<td>0,351</td>
<td>0,999</td>
STR;
preg_match_all( "#<td>(.*?)<\/td>#iU", $str, $result );


?  smile

Добавлено через 3 минуты и 39 секунд
В $result[ 1 ]; все что вам надо будет.

Автор: K0r0l 28.5.2008, 00:00
не... так засовывается все между первым и крайним <td>

Автор: gta4kv 28.5.2008, 00:09
K0r0l, а что надо?

Добавлено через 1 минуту и 25 секунд
У меня, простите, все нормально.

Код

  array(6) {
    [0]=>
    string(18) "some constant text"
    [1]=>
    string(0) ""
    [2]=>
    string(5) "1,000"
    [3]=>
    string(5) "0,944"
    [4]=>
    string(5) "0,351"
    [5]=>
    string(5) "0,999"
  }


все  по разным переменным.

Автор: K0r0l 28.5.2008, 00:19
хм видимо то что у меня вверху в коде как-то повлияло..

у меня вот такая штука заработала

Код

preg_match_all("/(?<=<td>)[^\s]{0,5}(?=<\/td>)/i", $text, $result);


кстати а такой вопрос а можно ли за один проход preg_match_all`ом выбрать по нескольким условиям взаимно не пересекающимся?
ну что-то типа массива $pattern в preg_replace...

Автор: gta4kv 28.5.2008, 00:24
K0r0l,  а вы попробуйте массив загнать с условиями. ;)

Автор: K0r0l 28.5.2008, 00:36
в смысле?

просто на самом деле стоит задача разобрать следующие куски текста (кусков такого типа в тексте много)

Код

<tr>
<td style='white-space:nowrap;'>2008-04-25<br />2008-04-27</td>
<td><a href='?a=342&ladder_id=3&competition_id=1158&' title='blablabla'> TITLE!!  1 2 3 </a></td>

<td>some constant text</td>
<td></td>
<td>0,000</td>
<td>0,000</td>
<td> --нету цифры а могла и быть-- </td>
<td>0,999</td>
<td></td>
<td></td>
<td>0,0</td><td></td><td>0</td><td style='white-space:nowrap;'>2008-04-01</td><td>7930</td><td>124</td><td>4</td><td></td><td></td><td style='white-space:nowrap;'><span style='color:red'>2008-05-27<br .>05:43+0</span></td>
</tr>


из этой штуки надо забрать номер, заголовок и три цифры вида x,xxx - выделил жирным то что надо вытащить

сообсна написал несколько match`ев для этого
Код

$res2 = preg_match_all("/(?<=ranking'>)[-a-zA-Z0-9_\s]*(?=<\/a>)/", $r, $text2);
$res1 = preg_match_all("/(?<==)[0-9]{4}(?=&)/i", $r, $text1);
$res3 = preg_match_all("/(?<=<td.*>)[^\s]{0,5}(?=<\/td>)/i", $r, $text3); //- крайняя совместными усилиями тут =)


вот и возник вопрос нельзя ли это в один preg_match запихать.. и если можно то как, потому что регулярными выражениями к своему стыду только сча начал пользоваться  smile 


Автор: gta4kv 28.5.2008, 00:42
вас спасет моя регулярка, ОДНА. копайте почему она у вас не работает.

Автор: K0r0l 29.5.2008, 00:52
спасибо =)
 
только я как более простой вариант решил сделать это через preg_replace
шаблоном описываю кусок между <tr> и </tr> и помечаю там круглыми скобками нужные мне для дальнейшего использования куски
парсинг такого куска
Код

<tr>
<td style='white-space:nowrap;'>2008-04-19<br />2008-04-26</td>
<td><a href='?a=342&ladder_id=3&competition_id=1106&' title='Ranking points for the competition in this ranking'>-- ТУТ НАЗВАНИЕ --</a></td>

<td>Paragliding XC</td>
<td></td>
<td>1,000</td>
<td>0,942</td>
<td>0,351</td>
<td>0,999</td>
<td>5</td>
<td></td>
<td>2395,8</td><td>12658,7</td><td>57</td><td style='white-space:nowrap;'>2008-04-01</td><td>8098</td><td>126</td><td>5</td><td>93,000</td><td>2426,000</td><td style='white-space:nowrap;'>2008-04-30<br .>22:23+0</td>

</tr>


только пока чего-то не работает.. не подскажите плз в чем ошибаюсь?
Код

$r= preg_replace("/<tr>[.]*competition_id=([0-9]{4})&[.]*>([-a-zA-Z0-9_\s]*08[-a-zA-Z0-9_\s]*)<\/a>[.]*<td><\/td>[\s]*<td>([^\s]{0,5})<\/td>[\s]*<td>([^\s]{0,5})<\/td>[\s]*<td>([^\s]{0,5})<\/td>[.]*<\/tr>/", "\\1 | \\2 | \\3 | \\4 | \\5<br>", $r);

Автор: gta4kv 29.5.2008, 09:47
Цитата

не подскажите плз в чем ошибаюсь?

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

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