Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Wyrażenia regularne
amii
post 22.06.2010, 09:02:25
Post #1





Grupa: Zarejestrowani
Postów: 728
Pomógł: 76
Dołączył: 12.06.2009

Ostrzeżenie: (0%)
-----


Chce wydobyć interesujące mnie ceny ze sklepów wraz z nazwami produktów. Oto skrypcik.

  1. <?php
  2. $pattern = '/^[0-9]{2,4},[0-9]{2} zł$/'; //cena w formacie xx.xx zł lub xxx,xx zł lub xxxx,xx zł gdzie x - dowolna cyfra
  3. $pattern1 = '/^<big>(.*)<\/big>$/'; //nazwa produktu umieszczona miedzy znacznikami <big></big>
  4.  
  5. $url = array('http://www.strona1.pl', 'http://www.strona2.pl', 'http://www.strona3.pl'); //lista stron do przeskanowania
  6.  
  7.  
  8.  
  9. for ($i=0; $i<count($url); $i++) {
  10. $zawartosc = file_get_contents($url[$i]);
  11.  
  12. $ile = preg_match_all($pattern, $zawartosc, $matches, PREG_PATTERN_ORDER);
  13. $ile1 = preg_match_all($pattern1, $zawartosc, $matches1, PREG_PATTERN_ORDER);
  14.  
  15. echo 'Produkt to <strong> ' . $matches[0][$i] . ' </strong> cena wynosi <strong> ' . $matches[0][$i] . ' </strong> PLN <br>';
  16. }
  17. ?>


Niestety skrypt nie działa sprawdzałem różne konfiguracje w wyświetlaniem $matches, $zawartosc zwraca OK więc najprawdopodobniej coś nie tak z wyrażeniami.


--------------------
gry flash online
Dobry hosting i tanie odnowienia domen firma: masternet.
Zarabianie bez wysiłku na domenach bez ruchu: prolink.
Go to the top of the page
+Quote Post
AlexDeLarge
post 22.06.2010, 09:10:27
Post #2





Grupa: Zarejestrowani
Postów: 85
Pomógł: 14
Dołączył: 14.02.2010

Ostrzeżenie: (0%)
-----


Cytat(amii @ 22.06.2010, 10:02:25 ) *
  1. <?php
  2. $pattern = '/^[0-9]{2,4},[0-9]{2} zł$/'; //cena w formacie xx.xx zł lub xxx,xx zł lub xxxx,xx zł gdzie x - dowolna cyfra
  3. $pattern1 = '/^<big>(.*)<\/big>$/'; //nazwa produktu umieszczona miedzy znacznikami <big></big>


używasz ^ i $ w wyrażeniach - czy $zawartość zawiera tylko i wyłącznie ciągi znaków wg wzorów z komentarzy? Sprawdź znaczenie tych operatorów.

Zdrówka życzę.

Ten post edytował AlexDeLarge 22.06.2010, 09:12:13


--------------------
Java and PHP developer 2007-2014 :)
Go to the top of the page
+Quote Post
amii
post 22.06.2010, 12:03:11
Post #3





Grupa: Zarejestrowani
Postów: 728
Pomógł: 76
Dołączył: 12.06.2009

Ostrzeżenie: (0%)
-----


OK rzeczywiście pomogło tylko mam problem z wydobyciem danych. Dla każdej wartości $url zwracane są dwie tablice wyników wie ktoś jak to wszystko wydrukować na ekran ? Spróbowałem czegoś takiego ale to zwraca tylko pierwszy wynik dla każdej strony z $url


  1. <?php
  2. $pattern = '/[0-9]{2,4},[0-9]{2} zł/'; //cena w formacie xx.xx zł lub xxx,xx zł lub xxxx,xx zł gdzie x - dowolna cyfra
  3. $pattern1 = '/<big>(.*)<\/big>/'; //nazwa produktu umieszczona miedzy znacznikami <big></big>
  4.  
  5. $url = array('http://www.strona1.pl', 'http://www.strona2.pl', 'http://www.strona3.pl'); //lista stron do przeskanowania
  6.  
  7.  
  8.  
  9. for ($i=0; $i<count($url); $i++) {
  10. $zawartosc = file_get_contents($url[$i]);
  11.  
  12. $ile = preg_match_all($pattern, $zawartosc, $matches, PREG_PATTERN_ORDER);
  13. $ile1 = preg_match_all($pattern1, $zawartosc, $matches1, PREG_PATTERN_ORDER);
  14.  
  15. for ($b=0; $b<count($ile); $b++) {
  16. echo 'Dla produktu <strong> ' . $matches1[0][$b] . ' </strong> cena wynosi <strong> ' . $matches[0][$b] . ' </strong> PLN <br>';
  17. }
  18.  
  19. }
  20. ?>


OK już nieważne głupi błąd zamiast count($ile) powinno być $ile.


Mam jeszcze jedne problem, który nie wiem jak ugryźć od strony algorytmicznej. Chodzi o to, że może wystąpić cena promocyjna i ona powinna zastąpić cenę zwykłą. Oczywiście tę pętle poniżej nie działają prawidłowo bo nie mogą działać. Przykładowo skan dla url[1]=http://www.strona1.pl
odnajduje 5 cen zwykłych i 2 ceny promocyjne. Teraz chodzi o to aby te ceny zwykłe zastąpić odpowiadającymi im cenami promocyjnymi.


  1. <?php
  2. $pattern = '/[0-9]{2,4},[0-9]{2}/'; //cena jako wyrazenie regularne
  3. $pattern1 = '/<big>(.*)<\/big>/'; //nazwa produktu jako wyrazenie
  4. $pattern2 = '/<span class="productSpecialPriceListing">[0-9]{2,4},[0-9]{2}</span>/'; //cena promocyjna jako wyrazenie regularne
  5.  
  6. $url = array('http://www.strona1.pl', 'http://www.strona2.pl', 'http://www.strona3.pl'); //lista stron do przeskanowania
  7.  
  8.  
  9. for ($i=0; $i<count($url); $i++) {
  10. $zawartosc = file_get_contents($url[$i]);
  11.  
  12. $ile = preg_match_all($pattern, $zawartosc, $matches, PREG_PATTERN_ORDER);
  13. $ile1 = preg_match_all($pattern1, $zawartosc, $matches1, PREG_PATTERN_ORDER);
  14. $ile2 = preg_match_all($pattern2, $zawartosc, $matches2, PREG_PATTERN_ORDER); //zwraca ilosc zastapien
  15.  
  16.  
  17. for ($b=0; $b<$ile; $b++) {
  18. for ($c=0; $c=<$ile2; $c++) {
  19. $matches[0][$b] = str_replace($matches[0][$b], $matches2[0][$c], $matches[0][$b]);
  20. }
  21.  
  22. echo 'Dla produktu <strong> ' . $matches1[0][$b] . ' </strong> cena wynosi <strong> ' . $matches[0][$b] . ' </strong> PLN <br>';
  23. }
  24.  
  25. }
  26.  
  27.  
  28. ?>


Ten post edytował amii 22.06.2010, 17:57:54


--------------------
gry flash online
Dobry hosting i tanie odnowienia domen firma: masternet.
Zarabianie bez wysiłku na domenach bez ruchu: prolink.
Go to the top of the page
+Quote Post
lukasz_os
post 22.06.2010, 12:21:06
Post #4





Grupa: Zarejestrowani
Postów: 203
Pomógł: 55
Dołączył: 23.11.2008
Skąd: UKF

Ostrzeżenie: (0%)
-----


Zapisuj produkty i ceny do nowej tablicy podczas przeszukiwania strony. Jeżeli wpis z danym produktem znajduję się w tablicy to porównuj ceny. Jak niższa - modyfikuj, jak nie to pomiń. Na koniec wyświetl tablicę i masz z głowy:)


--------------------
Pomagam jeśli mam czas oraz jak się na tym znam :D
Go to the top of the page
+Quote Post
amii
post 22.06.2010, 12:43:29
Post #5





Grupa: Zarejestrowani
Postów: 728
Pomógł: 76
Dołączył: 12.06.2009

Ostrzeżenie: (0%)
-----


No to chyba nie takie proste jak mówisz albo czegoś nie kapuje. Ceny, produkty mam wyszukane to nie jest problem. Problem jest jak skojarzyć cenę promocyjną z odpowiadająca ceną zwykłą, którą cena promocyjna ma zastąpić.
Skan może wyglądać dla strony A np tak:
produkt1 => 100
produkt2 => 150 (cena zwykła) 200 (cena promocyjna)
produkt3 => 300
produkt4 => 400
dla strony B
produkt5 => 300
produkt6 => 400
produkt7 => 850 (cena zwykła) 800 (cena promocyjna)
produkt8 => 950 (cena zwykła) 900 (cena promocyjna)
itd.

Jakbym to powsadzał to tablic to bym miało by to żadnego sensu. Teraz jak wyszukuje wzorcem dla cen zwykłych to wyszukuje też ceny promocyjne ale wtedy rąbie się dopasowanie ceny do produktu bo cena dla:
produkt3 => 200 (cena promocyjna) itd.


--------------------
gry flash online
Dobry hosting i tanie odnowienia domen firma: masternet.
Zarabianie bez wysiłku na domenach bez ruchu: prolink.
Go to the top of the page
+Quote Post
AlexDeLarge
post 22.06.2010, 14:06:23
Post #6





Grupa: Zarejestrowani
Postów: 85
Pomógł: 14
Dołączył: 14.02.2010

Ostrzeżenie: (0%)
-----


Nie za bardzo skumałem, ale nie możesz zrobić tak (pseudokod)?
  1. $productPattern = '/<div class="product">(.*)</div>/';
  2. $pricePattern = ...;
  3. $specialPricePattern = ...;
  4. $productNamePattern = ...;
  5.  
  6. $urls = array(...);
  7.  
  8. foreach ($urls as $url) {
  9. $products = array();
  10. $content = file_get...
  11.  
  12. preg_match_all($productPattern, $content, $products, ...);
  13.  
  14. $prods = $products[0]; //masz zawartość divów czy tam czegoś z produktami
  15.  
  16. foreach ($prods as $prod) {
  17. preg_match($productNamePattern, $prod, $pnmatch);
  18. preg_match($pricePattern, $prod, $pmatch);
  19. preg_match($specialPricePattern, $prod, $spmatch);
  20. $add = array();
  21. $add['name'] = $pnmatch[0];
  22. $add['price'] = empty($spmatch[0]) ? $pmatch[0] : $spmatch[0];
  23. $products[] = $add;
  24. }
  25.  
  26. }
  27.  
  28. //W ostateczności masz tablicę np:
  29. $products = array(
  30. array( 'name' => 'ABC', 'price' => '123'),
  31. array('name' => 'CDE', 'price' => '1234')
  32. );


Ja wiem, że mniej optymalne rozwiązanie, ale jak się nie ma co się lubi...

Zdrówka życzę.

Ten post edytował AlexDeLarge 22.06.2010, 14:10:09


--------------------
Java and PHP developer 2007-2014 :)
Go to the top of the page
+Quote Post
amii
post 23.06.2010, 08:59:02
Post #7





Grupa: Zarejestrowani
Postów: 728
Pomógł: 76
Dołączył: 12.06.2009

Ostrzeżenie: (0%)
-----


Próbowałem wdrożyć ten pseudokod ale nic z tego nie wyszło.... Sam wymyśliłem coś takiego i mam już dostęp do tych cen promocyjnych, które wyświetlają się testowym echo, tyle że nijak nie mogę ich zmienić bo ostatnie echo cały czas wyświetla te same wartości.



  1. <?php
  2. $pattern = '/(<span class="productSpecialPriceListing">)?[0-9]{2,4},[0-9]{2}/'; //cena jako wyrażenie regularne opcjonalnie dodaje span class, której obecność później jest sprawdzana w instrukcji warunkowej
  3. $pattern1 = '/<big>(.*)<\/big>/'; //nazwa produktu jako wyrażenie
  4.  
  5.  
  6. $url = array('www.strona1.pl', 'www.strona2.pl', 'www.strona3.pl');
  7.  
  8.  
  9.  
  10. for ($i=0; $i<count($url); $i++) {
  11. $zawartosc = file_get_contents($url[$i]);
  12.  
  13. $ile = preg_match_all($pattern, $zawartosc, $matches, PREG_PATTERN_ORDER);
  14. $ile1 = preg_match_all($pattern1, $zawartosc, $matches1, PREG_PATTERN_ORDER);
  15.  
  16.  
  17.  
  18.  
  19. for ($b=0; $b<$ile1; $b++) {
  20.  
  21. if (strpos($matches[0][$b], 'productSpecialPriceListing') !== false) { //jesli cena JEST cena promocyjna to..
  22. echo 'zamiana a wartosc przed usunieciem to : ' . $matches[0][$b] . '<br>';
  23. $matches[0][$b-1] = str_replace('<span class="productSpecialPriceListing">', '', $matches[0][$b]); //usuwamy niepotrzebny przedrostek
  24. array_slice($matches, $b); //usuwamy elemnet z tablicy
  25. $matches[0][$b-1] = $matches[0][$b];
  26. echo 'zamiana a wartosc po usunieciem to : ' . $matches[0][$b] . '<br>'; //wyświetla to samo co pierwsze echo
  27. }
  28.  
  29. echo 'Dla produktu <strong> ' . $matches1[0][$b] . ' </strong> cena wynosi <strong> ' . $matches[0][$b] . ' </strong> PLN <br>';
  30. }
  31.  
  32.  
  33.  
  34.  
  35. }
  36. ?>


Ten post edytował amii 23.06.2010, 09:00:11


--------------------
gry flash online
Dobry hosting i tanie odnowienia domen firma: masternet.
Zarabianie bez wysiłku na domenach bez ruchu: prolink.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.07.2025 - 01:38