Autor | Zpráva | ||
---|---|---|---|
gardener Profil |
#1 · Zasláno: 2. 10. 2010, 20:23:15 · Upravil/a: gardener
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 |
#2 · Zasláno: 2. 10. 2010, 23:06:44 · Upravil/a: Keeehi
'~<span style="font-size: 13px; line-height: 16px;">(.*?)xxx~s' 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 |
#3 · Zasláno: 4. 10. 2010, 09:59:09
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 |
#4 · Zasláno: 4. 10. 2010, 10:19:33
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 |
#5 · Zasláno: 4. 10. 2010, 10:58:20
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 |
#6 · Zasláno: 4. 10. 2010, 11:21:04
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 |
#7 · Zasláno: 4. 10. 2010, 12:39:54
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 |
#8 · Zasláno: 4. 10. 2010, 21:00:08
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"; } ?> |
||
Časová prodleva: 13 let
|
0