Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: preg_match_all i wyciąganie odpowiednich linków
Forum PHP.pl > Forum > PHP
Sztef89
Witam wszystkich. Jako, że to jest pierwszy mój post na tym forum, pragnę wszystkich powitać.

Ostatnio zacząłem się bawić wyciąganiem informacji ze stron i zatrzymałem się na filmweb bo jak wiadomo ma mnóstwo informacji smile.gif

Problem pojawił się gdy chciałem pobrać linki do filmów z danej strony. Pobrać wszystkie linki mi się udało ale potrzebuję tylko tych które prowadzą do filmów, czyli wyglądające w kodzie tak: href="/Jakas.nazwa" lub href="/film/costam"

A oto mój kod który pobiera WSZYSTKIE linki z danej strony:

  1. $strona = "http://www.filmweb.pl/search/film";
  2. $rC = curl_init();
  3. curl_setopt($rC, CURLOPT_HEADER, 1);
  4. curl_setopt($rC, CURLOPT_COOKIEFILE, 'cookies.txt');
  5. curl_setopt($rC, CURLOPT_COOKIEJAR, 'cookiesjar.txt');
  6. curl_setopt($rC, CURLOPT_RETURNTRANSFER, 1);
  7. curl_setopt($rC, CURLOPT_VERBOSE, 0);
  8. curl_setopt($rC, CURLOPT_USERAGENT, 'Googlebot/2.1 (+http://www.googlebot.com/bot.html)');
  9. curl_setopt($rC, CURLOPT_REFERER, 'www.google.pl');
  10. curl_setopt($rC, CURLOPT_URL, "$strona");
  11.  
  12. $wejscie = curl_exec($rC);
  13. curl_setopt($rC, CURLOPT_REFERER, $strona);
  14. $wejscie = curl_exec($rC);
  15.  
  16. $pattern = '/\b(?:href="?)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i';
  17. preg_match_all( $pattern, $wejscie, $matches);
  18. print_r ($matches);


trzeba zmienną $pattern zmodyfikować tak, żeby wyłapywał tylko linki wyglądające tak jak napisałem wyżej.

----------------

Drugie pytanie:

Jak skonstruować warunek do preg_match_all aby wyciągnąć z poniższego kodu tytuł filmu ?
  1. <h1 class="pageTitle item"><a href="/Zielona.Mila" title="Zielona Mila" property="v:name" class="fn"><span class="icoBig icoBigOnly icoBigMovie"></span>Zielona Mila</a></h1><h2 class="original-title">


Przejrzałem na prawdę dużo stron więc proszę mnie nie odsyłać do Google itp
Z góry dziękuje za pomoc smile.gif
pablo89pl
widocznie nie przejrzales, bo byś znalazł, tu na forum jest podobnych wątków dziesiątki..
Sztef89
ehh takiej odpowiedzi się spodziewałem niestety...
pisanie określonych warunków w preg_match do najłatwiejszych nie należy... przynajmniej mi ciężko to zrozumieć.
Nie spotkałem jeszcze żadnej strony która by opisywała jak tworzyć warunki tak żeby dało się zrozumieć... 3h szukania to za mało ?

Jeśli ktoś to potrafi to proszę się podzielić wiedzą zamiast pisać że to jest GDZIEŚ w internecie...


kod html wygląda tak:

  1. <div class="searchResultPhoto"> <a href="/Forrest.Gump"><img src="http://gfx.filmweb.pl/po/09/98/998/7314731.1.jpg" alt="Forrest Gump"></a>


jak widać po searchResultPhoto są spacje i potem mój szukany link a potem źródło obrazka.
Potrzebuje wyciągnąć tylko "/Forrest.Gump" z uwzględnieniem że napis searchResultPhoto znajduje się przed tym linkiem i po linku jest adres obrazka. Jeszcze przydałby się warunek że w linku może być tylko jeden /

Z góry dziękuję za odpowiedź.
cycofiasz
  1. <?
  2.  
  3. $src = file_get_contents('http://www.filmweb.pl/search/film');
  4.  
  5. preg_match_all('<a class="searchResultTitle" href="/([^"]+)">',$src,$result);
  6.  
  7. print_r($result[1]);
  8. ?>



Tu można poczytać co nieco:

https://developer.mozilla.org/pl/Dokumentac.../Obiekty/RegExp
Sztef89
Dzieki @cycofiasz ! smile.gif
Działa jak nalezy, teraz rozumiem dlaczego wcześniej mój kod nie działał.

Mam jeszcze jedno pytanie. Co jeżeli mamy taki kod html:

  1. <th>scenariusz:</th> <td> <a href="/person/Alyson+Fouse-40701" title="Alyson Fouse" >Alyson Fouse</a>


I chcemy z tego tekstu wyciągnąć ciąg pomiędzy > a </a>
Uwzględniając, że taki ciąg jest przed tym:

<th>scenariusz:</th>#<td>#<a href="*" title="*" >Alyson Fouse</a>

# spacje lub entery lub tabulatory
* jakiś ciąg znaków

Jeżeli znam dokładną liczbę tabulatorów w tych pustych miejscach to jak to zapisać w wyrażeniach regularnych ?

Jak zrozumiem preg_match to postaram się napisać jakiś mądry toturial bo w necie mało jest o tym a manuale wiadomo jakie są biggrin.gif
Z góry dziękuję za pomoc smile.gif
cycofiasz
Można tak:

  1. <?php
  2.  
  3. $str = '<th>scenariusz:</th> <td> <a href="/person/Alyson+Fouse-40701" title="Alyson Fouse" >Alyson Fouse</a>
  4.  
  5. ';
  6.  
  7. preg_match('#<th>scenariusz:</th>\s*<td>\s*<a href=".*" title=".*" >(.+)</a>#iU',$str,$m);
  8. print_r($m);
  9. ?>


A co do określania długości to wszystko masz w linku w moim poprzednim poście
Sztef89
Dzięki ! smile.gif na te ślaczki typu: .* .+ \s iU
nigdy bym raczej nie wpadł biggrin.gif A z pewnością nie dzisiejszego dnia smile.gif Nawet nie wiem do końca co te znaki oznaczają, fajnie by było jakby ktoś to rozpisał... w manualu nie ma o tym mowy a na stronach jakoś dziwnie opisują (może masz jakaś dobrą stronę do poczytania?)

Przerobiłem twój kod żeby najpierw pobierał wszystko pomiędzy <th>scenariusz:</th> a <th>premiera:</th>, a potem szukał w tym autorów scenariusza, działa pińknie winksmiley.jpg

  1. preg_match_all('@<th>scenariusz:</th>(.*?)<th>premiera:</th>@',$wejscie,$kscen);
  2. $skscen = implode("",$kscen[1]);
  3.  
  4. preg_match_all('#<a href=".*" title="(.+)" >#iU',$skscen,$scen);
  5. $sscen = implode(", ",$scen[1]);
  6.  
  7. echo '<strong>Scenariusz: </strong>';
  8. echo '<font color="green">';
  9. echo $sscen;
  10. echo '</font>';
  11. echo '<br/>';
thek
Bo informacji o tych znaczkach szukasz nie w manualu php, ale na stronach gdzie są opisane regexpy smile.gif Przykład? http://perldoc.perl.org/perlre.html Mam nadzieję, że strona pomoże winksmiley.jpg
Sztef89
Po angielsku... ale na pewno się przyda ! Dzięki ! guitar.gif
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.