Autor Zpráva
frantik
Profil *
Dobré ráno,

chci se zeptat co dělám špatně. Vše si vytahuju jak potřebuju, ale problém nastává, když to chci stylovat. Zjistil jsem, že to nejde po sobě jak jsem si původně myslel a chtěl. Ví někdo kde dělám chybu a popřípadě by byl tak hodný a opravil? Předem moc děkuju

  preg_match_all("/<div.*?>([^`]*?)<\/div>/", $site_vystup[0], $match);
  foreach($match[0] as $lin){
    preg_match('~src="([^"]*)"~', $lin, $img);
    preg_match("#href=\"date.fcgi(.*?)\"#", $lin, $link);
    preg_match("#<div.*?>(.*?)</div>#", $lin, $d1);
    preg_match('@<div class="content">(.*?)</div>@si', $lin, $d2);
    echo "<div class=\"img\"><img src=".$img[1]."></div>";
    echo "<div style=\"float:left\"><a ".$link[0].">Odkaz</a>";
    echo strip_tags($d1[0]);
    echo strip_tags($d2[0])."</div>
    <br class=\"end\">
 ";
  }

Moderátor Joker: Prosím nenakopávat vlákno nekonstruktivními příspěvky. Viz pravidla.
frantik
Profil *
Napadlo mne to vyřešit takhle: echo preg_replace('~src="([^"]*)"~', $lin);

To nevypíše už vůbec nic
Joker
Profil
frantik:
A co vlastně znamená „Zjistil jsem, že to nejde po sobě jak jsem si původně myslel a chtěl“?
frantik
Profil *
No chtěl jsem ve vetsím množství kodu vybrat obrázek, odkaz a nějaký text. Ten potom nastylovat, ale při stylování jsem zjistil, že to nejde jak jsem chtěl.

Jak jsem to uvedl, tak když to dám do stylu, tak se provede přibližně tohle:
<div class="start">
 <div class="img"><img src="obrazek.jpg"></div>
 <div></div>
</div>
<div class="start">
 <div></div>
 <div><a href="odkaz.html">Odkaz</a></div>
</div>

Ale já chtěl docílit tohoto:
<div class="start">
 <div class="img"><img src="obrazek.jpg"></div>
 <div><a href="odkaz.html">Odkaz</a></div>
</div>
Joker
Profil
frantik:
Aha. Tak záleží na tom, jak vypadá vstupní kód, možná je prostě špatně ten regulární výraz.
Uvedený výstup by to asi generovalo v případě, že na vstupu je nejdřív <div> jen s obrázkem a pak další <div> jen s odkazem.
Druhá možnost je, že jestli ten vstup má víc vnořených <div>ů, bude to trpět tímhle problémem:
obsah před <div>první <div>vnořený </div>ještě první </div>
Regulární výraz vybere tu označenou část.

V každém případě na pohyb v HTML kódu nejsou regulární výrazy ideální (viz problém zmíněný výše), lepší by bylo použít HTML DOM.

Edit: Smazal jsem z ukázkového kódu „div“ z obsahu, bylo to pak matoucí.
frantik
Profil *
Tak jsem se na ten dom podíval a vypadá to pěkně. Jen mám problém, že mi to vyhazuje stejný výsledky:
  $html = new simple_html_dom();  
  $html = str_get_html($site_vystup[0]); 
  foreach($html->find('img') as $e) {
    echo $html->find('a', 0)." - ".$html->find('img', 0)."<br>\n"; 
  }

Takhle vypadá výstup:
<a href="date.fcgi?akce=ID=3719175">Odkaz</a> - <img class="fr border" src="/img/common/ico/F.gif" alt="Fotografie" /><br>
<a href="date.fcgi?akce=ID=3719175">Odkaz</a> - <img class="fr border" src="/img/common/ico/F.gif" alt="Fotografie" /><br>
<a href="date.fcgi?akce=ID=3719175">Odkaz</a> - <img class="fr border" src="/img/common/ico/F.gif" alt="Fotografie" /><br>
<a href="date.fcgi?akce=ID=3719175">Odkaz</a> - <img class="fr border" src="/img/common/ico/F.gif" alt="Fotografie" /><br>



Tak jsem se na ten dom podíval a vypadá to pěkně. Jen mám problém, že mi to vyhazuje stejný výsledky:
  $html = new simple_html_dom();  
  $html = str_get_html($site_vystup[0]); 
  foreach($html->find('img') as $e) {
    echo $html->find('a', 0)." - ".$html->find('img', 0)."<br>\n"; 
  }

Takhle vypadá výstup:
<a href="date.fcgi?akce=ID=3719175">Odkaz</a> - <img class="fr border" src="/img/common/ico/F.gif" alt="Fotografie" /><br>
<a href="date.fcgi?akce=ID=3719175">Odkaz</a> - <img class="fr border" src="/img/common/ico/F.gif" alt="Fotografie" /><br>
<a href="date.fcgi?akce=ID=3719175">Odkaz</a> - <img class="fr border" src="/img/common/ico/F.gif" alt="Fotografie" /><br>
<a href="date.fcgi?akce=ID=3719175">Odkaz</a> - <img class="fr border" src="/img/common/ico/F.gif" alt="Fotografie" /><br>
Joker
Profil
frantik:
V každém cyklu se vždycky hledá to samé.

Princip by asi měl být:
foreach($html->find("prvek ve kterém je odkaz i obrázek" as $element) 
{
  // v $element se najde odkaz a pak obrázek
}
frantik
Profil *
Jak to prosím zapsat do foreach, když to je takhle?
<div class="cool">



Našel jsem, že se to dělá takhle:
  foreach($html->find("div.cool img") as $e) {
    echo $html->find('a', 0)." - ".$html->find('img', 0)."<br>\n"; 
  }
Když to takhle spustím, tak se mi nezobrazí nic.


Oprava:
Je to umístěné v <div class="cool arr">
foreach($html->find("div.cool arr img") as $e) {
Ale i když jsem to opravil, tak to nic nezobrazuje jako předchozí i když je to 100% ve vnitř
Joker
Profil
frantik:
Tak jestli to má najít div s třídou cool, mělo by to být takhle:
$html->find("div.cool")

A předpokládám, že uvnitř toho cyklu by místo $html mělo být $e.
frantik
Profil *
  foreach($html->find("div.cool arr") as $e) {
    echo $e->find('a', 0)." - ".$e->find('img', 0)."<br>\n"; 
  }

Tohle taky nefunguje


Chyba opravena :-) Už to maká. Dělal jsem chybu, že jsem vzal prvni div a ne ten ve kterém to přímo bylo. To znamená, ale že jsem tam kde jsem byl. Na text, který neni ve stejném divu budu muset použít jiný foreach a tudíš výsledek bude podobný. Jen s příjemnějším kodem.

Jste super, že mi takhle radíte a vážím si toho, ale co teď ?
Joker
Profil
frantik:
$html->find("div.cool arr")
Tohle najde prvek <arr> v prvku <div> s třídou "cool". Jinými slovy nejspíš nic.

Na text, který neni ve stejném divu budu muset použít jiný foreach a tudíš výsledek bude podobný.
No tak jestli to není všechno v tom <div>u, asi nebyl nejlepší nápad dělat cyklus zrovna přes ně. Pokud existuje nějaký prvek, který sdružuje ty požadované údaje a zároveň ne údaje které se mají vypsat v dalším cyklu, stačí dělat cyklus přes něj.

Jestli žádný takový „společný kontejner“ neexistuje, udělal bych cyklus třeba přes jednu položku, třeba odkazy, a druhou pak holt dohledával nějakým složitějším výrazem (jeho podoba závisí na tom, jak vypadají vstupní data).
frantik
Profil *
Tak to jde udělat po více divech? Moc Vám děkuju už jsem díky Vám mnohem blíž k cílové čáře.

Zajimal by mě třeba příklad tohodle:
<div class="stromek">
 <div class="vetev1">Nějaký text</div>
 <div class="vetev2">
  <strong>Nějaký text</strong>
  <strong class="color">Jsem silný</strong>
 </div>
<div><a href="http://neco.cz">Odkaz</a></div>
</div>

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: