Adatbányászati alapok - Haszprus überblog

Adatbányászati alapok

©   Haszprus   |   fejlesztés, php, adatbányászat

Ki akarjuk bányászni egy időjárásjelentő oldalról hogy hány fok van, hány fok lesz, stb.

/**
 * $source szovegbol kibanyassza a 
 * $id id-ju div erteket es 
 * $type tipusra castolva visszaadja
 */
function get_value_by_div_id($source, $id, $type) {
   $matches = array();
   $regexp = "<div.*?id\=\"$id\".*?>(.*?)<\/div>";
   preg_match("/$regexp/s", $source, $matches);
   settype($matches[1], $type);
   return $matches[1];
}

Így pl.

$source = '... <div id="current_temps">26&amp;amp;deg;C</div>... <div id="current_rfval">28&amp;amp;deg;C</div>...'; $t = get_value_by_div_id($source, "current_temps", 'int'); $e = get_value_by_div_id($source, "current_rfval", 'int'); echo "Hőmérséklet $t fok (érzésre $e)";

A kimeneten:

Hőmérséklet: 26 fok (érzésre 28 fok).


RSS: hozzászólások ehhez a bejegyzéshez 25 hozzászólás - Szólj hozzá Te is!


1) marvel (nem regisztrált)
A regexpben a .*? nem .* akar lenni?
Ha bármennyi darab bármiből van 0 vagy 1 darab, akkor az ugyanaz, mint a bármennyi. Nem jól gondolom?

Van köztük különbség, és fontos a különbség. Azt dönti el hogy a kifejezés greedy-e (mohó) avagy sem, azaz hogy a lehető leghosszabban illeszkedik, vagy a legrövidebben.

Rájössz a különbségre ha az alábbi html kódot veszed:

<div id="a">b<br />c</div>
Namost nem mindegy hogy a div teljes belsejét írja-e ki, vagy csak a c-t… (azaz hogy az első >-nél megáll vagy az utolsónál, amivel még teljesül a regexp többi része) itt a különbség a.* és a.*? között.

Starmerj's Perl RegExp Crib Sheet

Látom tényleg tetszik a dolog
Legköezebb, mire megnézem az oldalt, már saját kis időjárás kijelzés is lesz valamelyik sarokban


5) marvel (nem regisztrált)
Haszprus: thx az infót.

Btw ez nem kezeli le a keresett diven belüli további divek esetét, mielőtt valaki komolyabb alkalmazást szánna neki. Gyanítom, ahhoz némileg más jellegű megoldás kellene.

Btw:
$source = '…
<div id="current_temps">26&amp;deg;C
<div id="current_rfval">28&amp;deg;C</div></div>…';

$t = get_value_by_div_id($source, current_temps, 'int');
$e = get_value_by_div_id($t, current_rfval, 'int');

Így már igen

Nem, mer az első /div -ig illeszkedik a current_tempsre, így a $e-hez már nem is talál illeszkedést (hiszen abban a stringben már nincs is /div).

Van benne valami, ugyanakkor nekem működik Mindjárt megnézem a forrást, hogy iért is lehet ez.

Up: Meg is van. Igazad van, két divet nem lát, nekem DIVben IMGvel műxik.

Nomeg ha intre castoltatod akkor a $t értéke már kapásból csak annyi hogy 26

11) dankoi
Természetesen string típus mellett.

Az viszont nagyon érdekelne, hogy mi van, ha a $source így néz ki:
<div id="current_temps">26&amp;deg;C</div>

<div id="current_temps">akármi</div>
…;
?
Hogy tudom mindkét divet lekezelni (és főleg megkülönböztetni)?

Ez eleve nem valid, az id egyedi kell(ene) legyen egy html-ben.
De amúgy preg_match_all, és egy többszintű tömbben fogod visszakapni az összes illeszkedést.

13) dankoi
Kicsit korán van még nekem
Nem id-vel van, hanem class, de a lényegen ez sem változtat. Majd kipróbálom a preg_match_all -t, köszi!

14) NeoXon
Haszprus En is azt gyanitom, hogy a regexp nem lesz jo a html jelolonyelvre Ha visszaemlekszel FoNy-ra, a regexp 3. osztalyu, regularis nyelvtanokra fogalmaz meg szabalyokat.
Ezzel szemben a html kornyezetfuggo, 1. osztalyu nyelvtannal rendelkezik, hiszen nem mindegy, hogy egy adott jeloloelem milyen kornyezetben fordul elo.
Egyszoval: adathalaszathoz nem jonnek rosszul azok a franya veremautomatak, meg az LR(k) es LL(k) elemzok Egeszen bonyolult nyelvekhez, mint amilyen a magyar is, pedig muszaj leszel Turing gepet programozni

15) dankoi
A v0.1 -es flash már működik telefonon, netről lekért adatokkal

16) adamo
Help plz.
Van itten egy ilyen:
=?UTF-8?B?U3phYsOzIEdlcmdlbHk=?=
Megfelel kb. emberi nyelven: "=?"+"karakterek vagy számok vagy kötőjel"+"?"+"egy betű"+"?"+"bármilyen karakter"+"?="
Alkottam egy ilyet:
/(.*\=\?([a-z]|[A-Z]|[0-9]|-)+\?([qb]|[QB])\?.+?\?\=\?\=.*)/
De megfekszi a
=?ISO-8859-2?Q?=DAj_e-mal_c=EDmek?= string. Mi a megoldás, ha azt szeretném, hogy a qbQB kérdőjel utáni = jelet ne vegye a string végének.
Tudsz ebben segíteni?

Ez egy hosszabb stringnek a része?
Mert pl vhogy meg lehetne állapítani hogy mi az, ami már nem a felismerendő string része. Vagyis az utána jövő akárminek az elejét még told oda a regexp végére…
Ha viszont ennyi az egész string, akkor $ jelzi a string végét

Első körben most ennyi, nincs most időm erről hosszabban gondolkodni

Ja és [a-z]|[A-Z]|[0-9] = [a-zA-Z0-9], hasonlóképp a qb QB is összevonható, áttekinthetőbb úgy szvsz.

Valami olyan lib kéne, ami ötvözni tudja a regexpes játékot az xslt-s transzformációkkal. Ezzel kurva jól lehetne akármilyen bonyolult weblapról információt kivenni.

19) dankoi
Napkelet Csillaga Hmm, xslt -t nem ismerem, de érdekesnek hangzik

Volt egy érdekes problémám, mikor ki szerettem volna próbálni az elő verziós működő kódot a tárhelyemről futtatva, azt kaptam vissza, hogy a szerver nem támogatja a server-server kapcsolatot és pá.. Ilyet még nemláttam és hirtelen elég bánatos lettem.
Aztán szerencsére sikerlt találnom egyet, ami engedi ezt is. Ennek kapcsán megkérdezném, hogy a haszprus.hu támogat ilyen dolgokat?

Security risk lenne erre válaszolnom

21) dankoi
Haszprus rendben, értem. Akkor azt kérdezem, hogy a szolgáltatók milyen hányada tiltja ezt?


23) adamo
Haszprus thx. Végül is megoldódott a dolog. Kicsit variáltam még rajta, de most f@sza.

Ne maradjunk megoldás nélkül plz

25) adamo
Haszprus ok Levél header dekódolása volt a téma, több lépcsős megoldás született, indulórészlet:

$input =preg_replace('/(=\?[^?]+\?([qbQB])\?[^?]*\?=)(\s)+=\?/i', '\1=?',
$input);

While (preg_match('/(=\?([^?]+)\?(qb)\?([^?]*)\?=)/i',
$input, $matches)){…}


Egy évnél régebbi bejegyzésekhez nem lehet hozzászólni.