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?
Problema data la interviu
Moderatori: Moderatori, Start Moderator
-
Nicolae Florescu
- New Member
- Mesaje: 3
- Membru din: Sâm Sep 19, 2009 2:53 pm
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.
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.
-
Pirahna
- Senior Member
- Mesaje: 5985
- Membru din: Dum Aug 22, 2004 2:04 am
- Localitate: la birou
- Contact:
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.
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.
-
Nicolae Florescu
- New Member
- Mesaje: 3
- Membru din: Sâm Sep 19, 2009 2:53 pm
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:
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!
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!
-
Pirahna
- Senior Member
- Mesaje: 5985
- Membru din: Dum Aug 22, 2004 2:04 am
- Localitate: la birou
- Contact:
<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 !
?>
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 !
?>
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.
//edit
bravo Pirahna.
Ultima oară modificat Mar Sep 22, 2009 4:01 pm de către olympia, modificat 1 dată în total.
-
Nicolae Florescu
- New Member
- Mesaje: 3
- Membru din: Sâm Sep 19, 2009 2:53 pm
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.
-
Pirahna
- Senior Member
- Mesaje: 5985
- Membru din: Dum Aug 22, 2004 2:04 am
- Localitate: la birou
- Contact:
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 ...
(nu e complet in imagine, ala e doar un preview cu niste filtrari)
Cel mai bine e sa folosesti un API.
Cine este conectat
Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 24 vizitatori