Pagina 1 din 1

Problema data la interviu

Scris: Sâm Sep 19, 2009 3:14 pm
de Nicolae Florescu
Salut!
Am marea rugaminte de a ma lamuri daca se poate rezolva urmatoarea aplicatie pe care am primit-o la un interviu pt incepatori...cereau intre 4 si 24 luni experienta.

Aplicatia suna asa:
Sa fac o cautare pe google dupa un cuvant oarecare...exemplu "casa" si utilizand PHP si MY SQL sa salvez raspunsurile rezultate pe prima pagina de pe GOOGLE intr-un tabel dintr-o baza de date pe doua coloane: titlu, comentariu, ca mai apoi sa pot sa le afisez din nou. (mi-au fost oferite 2 ore pt rezolvare)

Clar ca nu am stiut cum sa o rezolv, pentru ca nu m-am mai intalnit cu o asa problema in cele 8 luni de experienta cu PHP, iar la final l-am intrebat pe cel care mi-a dat testul cum se poate rezolva. Mi-a spus ca folosind "expresii regulate"(regex) si mai sunt si multe alte metode.

Va rog sa ma lamuriti si sa ma ajutati sa intru pe un drum bun pentru a studia problema. Nu vreau neaparat sa imi dati un exemplu concret daca ia prea mult timp...dar macar sa va dati idei. Poate ca pentru cineva avansat nu e chiar asa de greu. Apropo...daca jobul era in Cluj si ofereau 500 euro remuneratie...cum vi se pare testul? Pentru ce nivel?

Scris: Sâm Sep 19, 2009 7:09 pm
de olympia
asta e calea sanatoasa:

http://www.fiftyfoureleven.com/site/cod ... sample.txt

la fata locului, as fi incercat sa fac un mic formular care sa ceara prin get cuvantul. sau cu curl. dupa aceea as fi scris codul pentru insert, select si afisare din db (inclusiv baza de date, dar astea sunt kestii care se fac repede la ce ti-au dat ei). mai complicat ar fi de scris patternurile ptr regexp, dar le-as fi lasat ultimele. probabil ca daca oamenii ar fi vazut ca ai fi avansat pana la un punct rezonabil, ai fi ramas "in carti" ptr job, nu stiu, zic si eu.

Scris: Sâm Sep 19, 2009 7:22 pm
de Pirahna
1. Preiei pagina (cu file_get_contents, fopen sau curl, care iti e mai usor si accesibil) : http://www.google.ro/search?hl=ro&site=case&q=case

2. Vezi cum sunt aranjate elementele (in cazul google ai un <li class="g w0"> care marcheaza inceputul rezultatului).
Ai un <h3 class="r"> <a href="adresa site" class="l" onmousedown="blablabla"> titlu site </a></h3>
dupa care putin mai jos ai un
<div class="s"> descriere <br> (divul se termina ceva mai jos)

Deci practic ai de extras elementele respective.

3. Trebuie sa faci expresia regulata care sa extraga datele respective ... in cazul asta ar fi

preg_match_all("/<h3 class="r"><a href=\"(.*)\" (.*)>(.*)</a></h3>(.*)<div class=\"s\">(.*)<br>/",$variabila_in_care_tii_pagina_de_la_google,$array_final);

La asta ar trebui adaugati cativa parametri referitori la tipurile de caractere, cat de greedy sa fie, etc, dar in mare cam asta e.

Am pus cu bold sectiunile importante, anume link, titlu si descriere.

4. Adaugi valorile din $array_final in baza de date.

Scris: Mar Sep 22, 2009 3:40 pm
de Nicolae Florescu
Multumesc amandurara pentru raspunsuri!
Pentru Pirahna:

Salut!
Am incercat sa inteleg si sa folosesc ce mi-ai dat mai sus. Imi dadea incontinu erori pana am studiat putin problema si nu-mi mai da erori, dar nu stiu daca e bine ce am facut (sunt modificari la preg_match_all....mai era nevoie de niste backslash-uri).
Uite cum arata acum codul:

Cod: Selectaţi tot

$homepage = file_get_contents...

preg_match_all("/<h3 class=r><a href=\" (.*) \" (.*) >(.*) <\/a><\/h3>(.*)<div class=\"s\"> (.*) <br>/",$homepage,$array_final);

print_r($array_final);


Nu am inteles inca de ce ai pus al doilea >>(.*)<< in interiorul lui a href.

Apoi, cand afisez in browser array-ul, imi da:

Array ( [0] => Array ( ) [1] => Array ( ) [2] => Array ( ) [3] => Array ( ) [4] => Array ( ) [5] => Array ( ) ) .

E ceva mai diferit decat la validari utilizarea expresiilor regulate in acest caz, si imi este mai greu sa inteleg. O sa te rog, daca vrei, sa ma mai ajuti putin, pentru ca nici pe net nu gasesc un exemplu cat de cat asemanator care sa ma ajute. Multumesc anticipat! Toate bune!

Scris: Mar Sep 22, 2009 3:44 pm
de Pirahna
<a href mai avea dupa link chestii gen id, onclick, etc, am pus si acolo ca sa le ia pe toate intr-o variabila si sa gasesti finalul tagului ( > ).

Aparent are nevoie de /miU la sfarsit (multiline, case-insensitive, ungreedy), altfel se opreste la primul rezultat.

Uite scriptul complet:


<?php

// google script thingie

$variabila_in_care_tii_pagina_de_la_google = file_get_contents("http://www.google.ro/search?hl=ro&q=casa");
preg_match_all("/<h3 class=r><a href=\"(.*)\"(.*)>(.*)<\/a><\/h3><div class=\"s\">(.*)<br>/miU",$variabila_in_care_tii_pagina_de_la_google,$array_final);

//print_r($array_final); // array final

for($i=0;$i<count($array_final[0]);$i++)
{
$titlu_link[$i] = $array_final[3][$i];
$adresa_link[$i] = $array_final[1][$i];
$descriere_link[$i] = $array_final[4][$i];
}

print_r($titlu_link);
print_r($adresa_link);
print_r($descriere_link);

// haha !

?>

Scris: Mar Sep 22, 2009 3:59 pm
de olympia
mai uitati-va un pic pe prototipul functiei preg_match_all. aici e vorba de a captura patternuri repetitive (rezultatele cautarii respective), pentru a le prelucra ulterior.

//edit
bravo Pirahna.

Scris: Mar Sep 22, 2009 4:00 pm
de Pirahna
olympia scrie:mai uitati-va un pic pe prototipul functiei preg_match_all. aici e vorba de a captura patternuri repetitive (rezultatele cautarii respective), pentru a le prelucra ulterior.


which i just did.

Scris: Mar Sep 22, 2009 4:06 pm
de Nicolae Florescu
multumesc frumos!
O zi placuta!

Scris: Joi Oct 01, 2009 12:07 pm
de ktapet
Pirahna scrie:
olympia scrie:mai uitati-va un pic pe prototipul functiei preg_match_all. aici e vorba de a captura patternuri repetitive (rezultatele cautarii respective), pentru a le prelucra ulterior.


which i just did.


si totusi
regexul propus de Pirania nu "merge" pt. orice cautare, cred ca ar fi mai bine sa se foloseasca 2 regexuri separate: unul pentru titluri si unul pentru comentarii. chiar trei inca unul pentru linkuri.

cel pentru titluri ar fi unul de forma data de Pirania:
"/<h3 class=r><a href="(.*)"(.*)>(.*)<\/a><\/h3>/miU"
poate ar merge si mai permisiv dar trebuie vazute mai multe cautari.
cel pentru comentarii ceva de forma:
'/<div class="s(.*)"(.*)>(.*)<br>/miU'
adica provenit tot din cel al lui Pirania dar facut mai permisiv.

Scris: Joi Oct 01, 2009 2:05 pm
de Pirahna
ktapet scrie:si totusi
regexul propus de Pirania nu "merge" pt. orice cautare, cred ca ar fi mai bine sa se foloseasca 2 regexuri separate: unul pentru titluri si unul pentru comentarii. chiar trei inca unul pentru linkuri.

cel pentru titluri ar fi unul de forma data de Pirania:
"/<h3 class=r><a href="(.*)"(.*)>(.*)<\/a><\/h3>/miU"
poate ar merge si mai permisiv dar trebuie vazute mai multe cautari.
cel pentru comentarii ceva de forma:
'/<div class="s(.*)"(.*)>(.*)<br>/miU'
adica provenit tot din cel al lui Pirania dar facut mai permisiv.


Da, stiu ca trebuiesc folosite mai multe expresii regulate (chiar mai multe decat ai specificat) ... codul scris de mine este pentru query-ul "case".

Codul complet pentru o cautare google "completa" are vreo 120 de linii ...
ImagineFull view
(nu e complet in imagine, ala e doar un preview cu niste filtrari)

Cel mai bine e sa folosesti un API.