arekgr
26.12.2009, 23:42:14
Witam
Próbuję wyciągnąć z tabelki dane za pomocą regexp .
Sytuacja następująca w pierwszym <td> </td> jest znane -stałe słowo "dane"
chcę wyciągnąć znaki zawierające sie w następnym <td></td> znaki to losowe słowa a-Z i 0-9 potrzebne do pracy.
ten kod pobiera prawie dobrze tylko nie kończy na następnej pozycji, drugim td, tylko przerabia caly dokument do konca , jak go poprawić ?
/dane(.*)<\/td>/si
Arek
Crozin
27.12.2009, 00:51:37
.* -> .*?
Poczytaj o tzw. zachłanności w wyrażeniach regularnych
arekgr
27.12.2009, 01:12:18
To nie pomaga za szybko się konczy, juz na kodzie <td>dane</td> i dalej nie czyta
/dane(.*?)<\/td>/si
Crozin
27.12.2009, 02:24:40
No to dodaj jeszcze do wyrażenia by odczytało i następne <td>...</td>
arekgr
27.12.2009, 12:20:48
w ten sposóbo pobiera za dużo ..
/dane(.*?)<\/td><td(.*?)><\/td>/si
jak to zrobić ? żeby pobralo zawartość z <td>dane</td> i drugiego <td>szukane !</td>
Crozin
27.12.2009, 12:33:54
W tym drugim to chyba chciałeś:
<td>(.*?)</td>, a nie to co napisałeś...
arekgr
27.12.2009, 13:06:07
poprawilem tak jak pisałeś i dodalem \s+ bo nic sie nie pojawilo ale i tak za duzo pobiera dodatkowe <td> ,a bez \s+ nic nie
pobiera ...
/dane(.*?)<\/td>\s+<td>(.*?)<\/td>/si
Crozin
27.12.2009, 13:33:09
<pre><?php
$content = <<<EOT
<table>
<tr>
<td>bla bla dane bla bla</td>
<td>xxx 1</td>
<td>yyy</td>
<td>zzz</td>
</tr>
<tr>
<td>bla bla bla bla</td>
<td>xxx</td>
<td>yyy</td>
<td>zzz</td>
</tr>
<tr>
<td>bla bla dane bla bla</td>
<td>xxx 2</td>
<td>yyy</td>
<td>zzz</td>
</tr>
<tr>
<td>bla bla bla bla</td>
<td>xxx</td>
<td>yyy</td>
<td>zzz</td>
</tr>
</table>
EOT;
preg_match_all('#<td>.*?dane.*?</td>.*?<td>(.*?)</td>#is', $content, $result);
Sprawdzone - działa.
arekgr
27.12.2009, 19:54:40
Dzieki za kod ale ten co podałeś również pobiera wszystkie dane pomiedzy tagami <td> a mi chodzilo o tag z słowem Dane i następny po nim, moja tabelka ma sporo wiecej tych zbytecznych td ...
Crozin
27.12.2009, 21:54:12
Tamten kod zwraca Ci wszystkie znalezione: <td>...dane...</td><td>...</td> (indeks zero tablicy $result)
Oraz wszystkie <td>...</td> wystąpujące zaraz po TD z "dane" (indeks 1 tablicy $result)
arekgr
27.12.2009, 22:17:27
Właśnie działa dobrze , ale mi chodziło tylko o zawartość tylko jednego tagu <td> tuż po <td> danych </td>
zegarek84
28.12.2009, 11:35:43
to jaki problem teraz z tej tablicy pobrać gotową wartość??
tutaj też masz gotową odpowiedź ale nie na wyrażeniach regularnych lecz DOM:
$content = <<<EOT
<table>
<tr>
<td>bla bla dane bla bla</td>
<td>xxx 1</td>
<td>yyy</td>
<td>zzz</td>
</tr>
<tr>
<td>bla bla bla bla</td>
<td>xxx</td>
<td>yyy</td>
<td>zzz</td>
</tr>
<tr>
<td>bla bla dane bla bla</td>
<td>xxx 2</td>
<td>yyy</td>
<td>zzz</td>
</tr>
<tr>
<td>bla bla bla bla</td>
<td>xxx</td>
<td>yyy</td>
<td>zzz</td>
</tr>
</table>
EOT;
$doc = new DOMDocument();
$doc->loadHTML($content);
echo $doc->getElementsByTagName('td')->item(1
)->nodeValue; // lub echo $doc->getElementsByTagName('td')->item(1)->textContent;
a jesli sie upierasz przy wyrazeniu regularnym to przelacznik U bedzie nieodzowny
'/dane.*<\/td>\s+<td>(.*)<\/td>/Usi'
arekgr
28.12.2009, 23:39:22
Witam dziękuje za zainteresowanie i kilka nowych odpowiedzi , w dalszym ciągu regexp w takiej postaci nie wydziela prawidlowo danych
preg_match_all("/Lokalizacja.*<\/td>\s+<td>(.*)<\/td>/Usi",$curl_result, $out PREG_SET_ORDER);
może faktycznie zrobić to na dom..
Arek G
dziękuje wszystkim ślicznie !
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.