Autor Zpráva
gardener
Profil
Ahoj, chtěl bych se někoho zkušeného zeptat, zda netuší jako pomocí preg_match_all fce zapat regularni vyraz, ktery by mi vytahl content, ktery je na webu uzavren v
div #middle2 span ?

Snazim vygrabovat obsah deniho horoskopu na Seznamu.

div #middle2 je tedy jeste obalen spoustou jinych ale to bz na to nemelo mit vliv..

Zkousel jsem na to prijit a googlit ale vzdy se mi povedlo dostat jen span a to neni to co bych rad..
Diky za kazdou radu
Keeehi
Profil
'~<span style="font-size: 13px; line-height: 16px;">(.*?)xxx~s'
xxx si musíte nahradit nějakým řetězcem, který bude určovat konec. Jelikož nevím, kolík toho potřebujete najít (co všechno je předmětem vašeho zájmu), musíte si ho najít sám. Ten řetězec musí být dostatečně unikátní, protože se hledání při prvním výskytu ukončí. příklad:
text: <div><span>text <span>text ve dvojitém spanu</span> a tady je ještě další</span></div>
regulár: "<span>(.*?)</span>" => výsledek: "text <span>text ve dvojitém spanu"
regulár: "<span>(.*?)</span></div>" => výsledek: "text <span>text ve dvojitém spanu</span> a tady je ještě další"
gardener
Profil
Keeehi:
Díky moz za radu, ale pokud zkusím například


$flag = preg_match("/<span>(.*?)</span>/",$result, $matches);


dostanu
Warning: preg_match() [function.preg-match]: Unknown modifier '(' in C:\Data\Programing\PHP\www\apps\horoscope\curl.php on line 33

zkoušel jsem i verzi bez slashovani, i upravit regular jen na (.*) ale výsledek je stejný, zřejmě to skončí chybou při parsování toho zdrojáku z horoskopy.cz
PostCC
Profil
gardener:
Tohle:

/<span>(.*?)</span>/


není správně zapsaný regulární výraz, protože "modifier" - v tomto případě "/" - se vyskytuje nejen na začátku a konci řetězce. Použijte buď jiný modifikátor:

~<span>(.*?)</span>~


nebo slashujte ten uvnitř řetězce:

/<span>(.*?)<\/span>/
gardener
Profil
Tak nevím, zkoušel jsem obojí, pattern se sice najde, ale vrácené pole je prázdné:
$flag = preg_match_all("~<span>(.*?)</span>~",$result, $matches);
// Check if regex was successful
if ($flag = true)
{
var_dump($matches);
echo htmlentities($matches[0]);

echo htmlentities($matches[1]);
}
PostCC
Profil
gardener:
Nemyslím, že pattern se najde. Vy ho totiž neporovnáváte, nýbrž přiřazujete. Zde:

if ($flag = true)


zřejmě míníte spíše:

if ($flag == true)


nebo ještě jednodušeji:

if ($flag)


Pak zřejmě uvidíte, že pattern se nenajde. Příčina ale asi bude jinde - zkuste si před zjišťováním souladu s regulárním výrazem nejprve vypsat obsah proměnné $result, zda skutečně obsahuje to, co očekáváte.
__construct
Profil
Odporúčam použiť Simple HTML DOM a nie RegExp.
Potom by to mohlo vyzerať nejak takto:
<?php
require 'simple_html_dom.php';

$html = new simple_html_dom();
$html->load_file('http://www.seznam.cz/');

$element = $html->find('#gadget-7 p');
echo '<pre>';
foreach($element as $a){
 var_export($a->plaintext);
 echo "<br>\n";
 var_export($a->innertext);
 echo "<br>\n";
 var_export($a->outertext);
 echo "<br>\n";
}
gardener
Profil
Diky, ja jsem to zkusil takto ale mam problem, jak to vyselektovat z tohoto co zbyde, jelikoz treba zacatek, popis znameni, lide v tomto znameni nepotrebuji, ale jsou porad v tagu span, takze jedine necitat tyto span tagy do pole a vybirat si jen ty, jejich index potrebuji?

<?php
require 'simplehtmldom/simple_html_dom.php';

$html = new simple_html_dom();
$html->load_file('http://www.horoskopy.cz/vahy/');

$ret = $html->find('#middle2'); 



foreach($ret as $a){

echo $a->innertext;
echo "<br>\n";
}

?>

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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

0