Autor Zpráva
grimword
Profil
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
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
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
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
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
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
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
Vyřešeno. Děkuji.
anonymníí
Profil *
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
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
Nakonec jsem použil:

'/<tr class="(|column1)"><td>(.*)<\/td>/U'

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: