Autor | Zpráva | ||
---|---|---|---|
Prochy Profil |
Ahoj,
už delší dobou mě trápí, že mi funguje vyhledávání Nodu jinak na serveru (7.0.19, Linux) a jinak na localhostu (PHP 7.0.29, Windows). Nejlepší to uvedu na příkladu: Mám dejme tomu tento kód: <tr class="po7 kapitanFalse"> <td class="center first" style="width: 10px">9</td> <td> <div> František Cecvárek <span style="float:right">Z </span> <div style="clear:both;"> </div> </div> </td> <td class="center" style="width: 90px">12345678</td> <td class="center" style="width: 25px;text-align:center;">26</td> <td class="center" style="width: 25px;text-align:center;"></td> <td class="center" style="width: 25px;text-align:center;"></td> <td class="center" style="width: 25px;text-align:center;"></td> <td class="center" style="width: 25px;text-align:center;"></td> <td class="center last" style="width: 25px;text-align:center;"></td> </tr> K hlavnímu tr řádku se dostanu následovně: $element = $finder->query("/html/body/form/div[2]/div[2]/table[3]/tr/td[1]/table/tr[" . $i++ . "]")->item(0); Pak to parsuji následovně: $childNodes = $element->childNodes; if (isset($players[$childNodes->item(4)->nodeValue])) . . . A tady už je problém, jelikož pokuď chci vytáhnout číslo "12345678" na serveru, tak je správně $childNodes->item(4), pokud na localhostu tak $childNodes->item(5). Prostě to je posunutý o 1. Může mi někdo vysvětlit, kde může být problém? Nechce se mi věřit, že chyba bude v odlišné verzi a taky se mi nechce věřit, že by za to mohl jiný OS, ale nic jiného mě nenapadá. Je to celkem problematický, když potřebuji něco ladit na localhostu a otestovat si nově napsaný kód, jelikož mi to chodí chybu, právě kvůli této prapodivné odlišnosti. Děkuji za rady. |
||
juriad Profil |
Hádám, že za to můžou bílé znaky mezi elementy. Přesnou příčinu zjistíš, když si vypíšeš všechny nody v řádku spolu s jejich typem a přesným obsahem (například do textarea). V ukázce, kterou jsi dal je to skutečně item(5):
<tr class="po7 kapitanFalse"> <td class="center first" style="width: 10px">9</td> <td> <div> František Cecvárek <span style="float:right">Z </span> <div style="clear:both;"> </div> </div> </td> <td class="center" style="width: 90px">12345678</td> <td class="center" style="width: 25px;text-align:center;">26</td> <td class="center" style="width: 25px;text-align:center;"></td> <td class="center" style="width: 25px;text-align:center;"></td> <td class="center" style="width: 25px;text-align:center;"></td> <td class="center" style="width: 25px;text-align:center;"></td> <td class="center last" style="width: 25px;text-align:center;"></td> </tr> childNodes obsahuje nejen DOMElement, ale i DOMText nody. Ty tebe nezajímají. Zkus se jich nějak zbavit: * například načti dokument s preserveWhiteSpace=false ,
* hledej jinak: $element->getElementsByTagName('td')->item(2) ,
* použij další xpath dotaz: $finder->query('./td[2]', $element)->item(2) , či $finder->query('./td')->item(2) ,
* rozšiř existující query: $finder->query("/html/body/form/div[2]/div[2]/table[3]/tr/td[1]/table/tr[" . $i++ . "]/td[2]")->item(0)
Už to, že musíš používat čísla 4 nebo 5, když se jedná o buňku s indexem 2 je podezřelé. |
||
Prochy Profil |
#3 · Zasláno: 7. 5. 2018, 23:05:02
Děkuji, ráno se na to podívám. Divné ale je to, že ten text se v ničem neliší, zkopíruji ho tam ze schránky jak na localhost tak na server a na tom localhostu mi to zahlásí problém. Asi tam je něco jinak nastaveno u PHP verze, jinak si to neumím vysvětlit.
Ale souhlasím, že ty indexy mi trochu lámaly hlavu, že to je takhle "chybně" číslované. Tak jsem to v rychlosti jen vyzkoušel a to s tím getElementsByTagName funguje, tak jak bych si představoval. 0 = 1. buňka, 3 = 3. buňka atd. je přesně to, jak bych to očekával, že se to bude chovat. Ještě jednou díky. |
||
Časová prodleva: 6 let
|
0