Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] preg_match_all jak obrobić wyniki
Forum PHP.pl > Forum > Przedszkole
amii
Mam taką funkcję, która korzystając z wyszukiwarki wydobywa adresy URL, niestety nie wiem jak się dostać do wyników zwróconych z print_r($matches) tam wyświetla się 100 rekordów

  1. function href() {
  2. $pusta = array();
  3. $licznik = 0;
  4. for ($a=0; $a<101; $a+=10) {
  5. $url1 = 'http://blogsearch.google.com/blogsearch?hl=en&ie=UTF-8&q=przykladowe+zapytanie&btnG=Search+Blogsi&sa=N&start='.$a; //robimy petelke dla pierwszych 100 stron
  6. $zawartosc = file_get_contents($url1);
  7. $pattern = '/<font size=-1><a class=f1 href="(.*)" id="pb-[0-9]"/i';
  8. $ile = preg_match_all($pattern, $zawartosc, $matches); //w $ile przechowujemy ilosc dopasowan
  9.  
  10.  
  11.  
  12. $pusta[$licznik] = substr($matches[0][0], (strpos($matches[0][0], 'href="')+6), (strpos($matches[0][0], 'id="pb')-34)); //wydobywamy wlasciwy adres url
  13. $licznik++;
  14. }
  15.  
  16.  
  17. for ($k=0; $k<count($pusta); $k++) echo 'Dopasowanie : ' . $pusta[$k] . '<br>'; /wyswietla tylko 10 rekordow pierwsze pobrane z kazdej strony
  18. }
everth
Może coś takiego, nie daję gwarancji że zadziała:
  1. function href() {
  2. $result = array();
  3. $doc = new DOMDocument();
  4. $xpath = new DOMXPath($doc);
  5.  
  6. $url1 = 'http://blogsearch.google.com/blogsearch?hl=en&ie=UTF-8&q=przykladowe+zapytanie&btnG=Search+Blogsi&sa=N&start=';
  7.  
  8. for ($a=0; $a<101; $a+=10) { //dla mnie to petla dla 10 stron, ale co tam ;)
  9. $url1 .= $a; //robimy petelke dla pierwszych 100 stron
  10. $doc->loadHTMLFile($url1);
  11. $links = $xpath->query("//a[@class='f1' and starts-with(@id, 'pb-')]"); //znajdź elementy a o klasie f1 i id zaczynającym się od pb-
  12.  
  13. $limes = (count($links)<10) ? count($links):10; //ustalamy granice dla 10 rekordow lub mniej (gdy linkow jest mniej
  14.  
  15. for ($k=0; $k<$limes; $k++) {
  16. $href = $links->item($k)->getAttribute('href'); // nasz link
  17. $result[] = $href;
  18. echo 'Dopasowanie : ' . $href . '<br>'; //wyswietla tylko 10 rekordow pierwsze pobrane z kazdej strony
  19. }
  20.  
  21. }
  22. return $result;
  23. }
amii
Trochę pozmieniałem. Ale nadal wyskakuje coś takiego i nic nie zwraca -> http://serwisosmoz.eu/index1.php

  1. function href() {
  2. $result = array();
  3. $doc = new DOMDocument();
  4. $xpath = new DOMXPath($doc);
  5.  
  6.  
  7. for ($a=0; $a<101; $a+=10) { //dla mnie to petla dla 10 stron, ale co tam ;)
  8.  
  9.  
  10. $url1 = 'http://blogsearch.google.com/blogsearch?hl=en&ie=UTF-8&q=przykladowe+zapytanie&btnG=Search+Blogsi&sa=N&start='.$a;
  11. echo 'url to : ' . $url1;
  12.  
  13. $doc->loadHTMLFile($url1);
  14. $links = $xpath->query("//a[@class='f1' and starts-with(@id, 'pb-')]"); //znajdź elementy a o klasie f1 i id zaczynającym się od pb-
  15.  
  16. $limes = (count($links)<10) ? count($links):10; //ustalamy granice dla 10 rekordow lub mniej (gdy linkow jest mniej
  17.  
  18. for ($k=0; $k<$limes; $k++) {
  19. $href = $links->item($k); // nasz link
  20. if ($href != null) $href->getAttribute('href'); //tu wczesniej wyskakiwał blad -> Call to a member function getAttribute() on a non-object
  21. $result[] = $href;
  22. echo 'Dopasowanie : ' . $href . '<br>'; //wyswietla tylko 10 rekordow pierwsze pobrane z kazdej strony
  23. }
  24.  
  25. }
  26. return $result;
  27. }
everth
Sprawdź co zwraca funkcja $doc->loadHTMLFile (np. za pomocą var_dump()). Możliwe że nie wolno jej otwierać zewnętrznych zasobów po URL.
amii
Funkcja zwraca boolowski true więc niby ok. Wygląda na to, ze nie znajduje dopasowań.
everth
Czekaj, może xpath jest źle skonstruowany. Daj var_dump na '$links' oraz na 'count($links)'.

EDIT: Dodatkowo jeszcze sprawdź co jest pod $doc->documentElement, czasem xpath nie działa na złych HTML-ach
amii
Dałem tak:

  1. var_dump($links);
  2. $ilosc = count($links);
  3. echo 'separator <br>';
  4. var_dump($ilosc);
  5. echo 'separator <br>';
  6. $wyswietl = $doc->documentElement;
  7. var_dump($wyswietl);
  8. echo '<br><br>';


Wyskoczyło to -> http://serwisosmoz.eu/index1.php
everth
To powinno ci zadziałać (u mnie działa biggrin.gif). Zwraca tablicę z adresami. Sama funkcja wykonuje się dosyć wolno (bo odpytuje po adresach). Aha, zainteresuj się dodatkiem XDebug do PHPa
  1. function href() {
  2. $result = array();
  3. $doc = new DOMDocument();
  4.  
  5. for ($a=0; $a<101; $a+=10) { //dla mnie to petla dla 10 stron, ale co tam ;)
  6. $url1 = 'http://blogsearch.google.com/blogsearch?hl=en&ie=UTF-8&q=przykladowe+zapytanie&btnG=Search+Blogsi&sa=N&start='.$a;
  7.  
  8. @$doc->loadHTMLFile($url1);
  9. $links = simplexml_import_dom($doc)->xpath("//a[@class='f1' and starts-with(@id, 'pb-')]"); //znajdź elementy a o klasie f1 i id zaczynającym się od pb
  10.  
  11. $limes = (count($links)<10) ? count($links):10; //ustalamy granice dla 10 rekordow lub mniej (gdy linkow jest mniej
  12. for ($k=0; $k<$limes; $k++) {
  13. $href = (string) $links[$k]['href']; // nasz link
  14. if ($href != null) $result[] = $href; // dodajemy jeśli link istnieje
  15. }
  16. }
  17. return $result;
  18. }
  19.  
  20. var_dump(href()); // wyświetla wyniki
amii
everth wielkie dzięki rzeczywiście działa smile.gif Poczytam sobie trochę o modelu DOM i debugerze.
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.