Autor | Zpráva | ||
---|---|---|---|
grimword Profil |
#1 · Zasláno: 17. 1. 2016, 12:42:58
Ahojte,
potřeboval bych z řetězce dostat slova, která jsou obklopená tagy <td class="auto"> a <td class="motorka"> a ukončená tagem </td>. Poradíte, jak na to? VSTUPNÍ ŘETĚZEC <td class="auto">Škoda</td> <td class="najeto">123 123</td> <td class="motorka">Yamaha</td> <td class="najeto">456 456</td> <td class="auto">BMW</td> <td class="najeto">789 789</td> <td class="motorka">Honda</td> <td class="najeto"> 345 345</td> VÝSTUPNÍ ŘETĚZEC (JAK SI JEJ PŘEDSTAVUJI) Škoda Yamaha BMW Honda |
||
mimochodec Profil |
#2 · Zasláno: 17. 1. 2016, 12:51:37
Možná to není přesně to, co potřebuješ, ale já používám simplehtmldom.sourceforge.net
Získat obsah všech td.auto lze pak takto: foreach($html->find('td.auto') as $element) echo $element->innertext.'<br>'; |
||
grimword Profil |
Děkuji, ale potřeboval by jsem, aby to byl čistý PHP kód, ne nějaký framework apod.
1. Myslíte, že by se dalo nějak vyjít z tohoto? preg_match_all("'<td class="auto">(.*?)</td>'", $vstupni_retezec, $vystupni_retezec); 2. Nebo by se případně dalo vyjít z tohoto? list($t_junk, $t_good) = split('<td class="auto">', $data); list($t_good, $t_junk) = split('</td>', $t_good); $txt = $t_good; |
||
smitka Profil |
#4 · Zasláno: 17. 1. 2016, 13:17:03
Na toto jsou určené především regulární výrazy - lze to napsat např.
/<td class="(auto|motorka)">(\w+)<\/td>/iu sandbox.onlinephpfunctions.com/code/740b8980ac65720ffa832b316c0387935324d701 |
||
grimword Profil |
smitka:
> Na toto jsou určené především regulární výrazy - lze to napsat např. > > /<td class="(auto|motorka)">(\w+)<\/td>/iu > sandbox.onlinephpfunctions.com/code/740b8980ac65720ffa832b316c0387935324d701 ______________________________________________________________________________________ Děkuji. Toto funguje naprosto perfektně. ALE... . Má skutečná situace je, že těmi tagy je <tr class="column1"><td> a <tr class=""><td> a ukončující tag je </td>. Takže jsem tvůj skript uzpůsobil takto: $query="SELECT * FROM .............."; $result=mysql_query($query); while ($vypis=mysql_fetch_array($result)) { $data = $vypis['text']; } $matches = null; preg_match_all('/<tr class="(|column1)"><td>(\w+)<\/td>/iu', $data, $matches); for ($p = 0; $p < count($matches); ++$p){ echo ($matches[2][$p]."<br>"); } A v tomto okamžiku to už nefunguje... . |
||
Dan Charousek Profil |
#6 · Zasláno: 17. 1. 2016, 14:09:15
grimword:
Jak vypadá struktura databáze? Na řádku 5 v [#5] si stále dokola přepisuješ proměnnou data, takže na řádku 10 obsahuje pouze hodnotu sloupce "text" z posledního záznamu. Jak vypadají jednotlivé řádky tabulky? A přijde mi zvláštní si ukládat do tabulky tímto způsobem jakousi html tabulku. Nebylo by lepší udržovat čistě hodnoty (škoda, bmw, atd...) a až při vykreslování je vypisovat do tabulky? Zbavíš se tím potřeby provádět nějaké takové operace. Napadá mě jednodušší řešení, ale nerad bych ho publikoval, dokud nebudu mít jistotu, že se ten problém nedá řešit návrhově jinak. |
||
grimword Profil |
#7 · Zasláno: 17. 1. 2016, 14:24:30
Jak vypadá struktura databáze? Na řádku 5 v [#5] si stále dokola přepisuješ proměnnou data, takže na řádku 10 obsahuje pouze hodnotu sloupce "text" z posledního záznamu.
Nepřepisuji, skutečný Mysql dotaz má v sobě něco na způsob "where id='2'". Jak vypadají jednotlivé řádky tabulky? A přijde mi zvláštní si ukládat do tabulky tímto způsobem jakousi html tabulku. Nebylo by lepší udržovat čistě hodnoty (škoda, bmw, atd...) a až při vykreslování je vypisovat do tabulky? Zbavíš se tím potřeby provádět nějaké takové operace. Celá tabulka je v podstatě "vykradený web" pomocí file_get_contents(). (není to nelegální jen potřebuji vytáhnout nějaká veřejně dostupná data z webu pro mé účely) Má sloupce "id", "url" a "text". A sloupec "text" je v podstatě kompletní zdrojový kód té dané URL. A já potřebuji z toho zdrojového kódu vytáhnout hodnoty, které jsou uzavřeny v <tr class="column1"><td>TEXT</td> nebo které jsou uzavřeny v <tr class="">TEXT</td>. |
||
Dan Charousek Profil |
grimword:
„Nepřepisuji, skutečný Mysql dotaz má v sobě něco na způsob "where id='2'".“ Ok, takže ten while je tam zbytečný: $query = "SELECT * FROM .............."; $result = mysql_query($query); $data = mysql_fetch_array($result); Každopádně bych nejdřív data vyparsoval a až poté uložil do databáze. Je nutné to dělat v tomto pořadí? Ještě dodám, že bys neměl používat mysql. Můžeš poskytnout větší část toho kódu k parsování? |
||
grimword Profil |
#9 · Zasláno: 17. 1. 2016, 14:43:55
Dan Charousek:
Každopádně bych nejdřív data vyparsoval a až poté uložil do databáze. A přesně to chci udělat!!! Chci ty data vyparsovat. Uložit do databáze. A smazat sloupec s kompletní zdrojovým kódem. A můj dotaz je, jak vyparsovat data, která jsou obklopena tagy <tr class="column1"><td>TEXT</td> a <tr class=""><td>TEXT</td>. //mysql dotaz upravím |
||
Keeehi Profil |
#10 · Zasláno: 17. 1. 2016, 17:16:05
Tak se vrátíme trochu zpátky. Simplehtmldom není framework ale knihovna. Jestli nechceš ani to, tak tu máš DOM, XML parser, Simplex XML. Obecně se doporučuje tento přístup než použití regulárních výrazů.
Jinak ten regulár bych napsal takto: '~<tr class="(?:column1)?"><td>([^<]*)</td>~iu' |
||
grimword Profil |
#11 · Zasláno: 19. 1. 2016, 06:36:31
Vyřešeno. Děkuji.
|
||
anonymníí Profil * |
#12 · Zasláno: 19. 1. 2016, 08:25:00
Keeehi:
Budu mít malý dotaz k tomu tvému reguláru, když už vlákno je vyřešené, snad to tu nebude překážet. Uvnitř jsi uvedl (?:column1)? , co přesně znamená to ?: na začátku a proč tam je? Nikde jsem to nemohl najít a význam zde mi uniká. Pokud tam má být hodnota "column1", nebo nic, stačilo by přeci ...class="(column1)?"... , nebo ne?
Díky za upřesnění. |
||
blaaablaaa Profil |
#13 · Zasláno: 19. 1. 2016, 08:35:33
anonymníí:
Pokud bys dal class="(column1)? " (v zadani bylo, ze class muze byt i prazdna), do $matches bys dostal i "column1", pokud pouzijes ?:, retezec se do vysledku neulozi. |
||
grimword Profil |
#14 · Zasláno: 20. 1. 2016, 05:06:36
Nakonec jsem použil:
'/<tr class="(|column1)"><td>(.*)<\/td>/U' |
||
Časová prodleva: 8 let
|
0