Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Wyrażenia regularne
Forum PHP.pl > Forum > Przedszkole
amii
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.
AlexDeLarge
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ę.
amii
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. ?>
lukasz_os
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:)
amii
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.
AlexDeLarge
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ę.
amii
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. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.