Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]preg_match, co nie tak?
Forum PHP.pl > Forum > Przedszkole
grzegosh
Witam.
Uczę się od paru godzin jak pobrać interesującą mnie część strony. Wybrałem do treningu onet i dział sportowy, który chcę wyciąć i umieścić na testowej stronie.
Wyrażenie reguralne zrobiłem dobrze, sprawdziłem je na stronie regexpal.com - dowód: http://img200.imageshack.us/img200/1530/zrzutq.jpg

Kod php
  1. <?php
  2. $subject = file_get_contents("http://www.onet.pl");
  3. preg_match('|<ul id="nsg_box_sport">.*?(s*?.*?)*?</ul>|', $subject, $matches);
  4.  
  5. echo "<br /><br />";
  6. print_r ($matches);
  7. ?>

Niestety, owy kod wyświetla mi tylko Array(), jeśli zamieniam | na / na początku i na koncu, wyświetla błąd:
Warning: preg_match() [function.preg-match]: Unknown modifier 'l' in ... on line 3

O co chodzi? Zapewne o to, że nie wiem jak wpisać to wyrażenie do funkcji preg_match... To zapewne błachy problem, ale proszę o wyrozumiałość. Dziękuję.
Wicepsik
  1. <?php
  2. preg_match('/<ul id="nsg_box_sport">.*?(s*?.*?)*?</ul>/', $subject, $matches);
  3. ?>
grzegosh
Dzięki za tak szybką odpowiedź smile.gif
Nie wiem gdzie mam oczy, ze nie wziąłem tego backslesha przy </ul>...
Aczkolwiek, dalej nie działa poprawnie, wyświetla tylko Array ( ).
W czym leży błąd?
ernie242
może też być tak:

preg_match('%<ul id="nsg_box_sport">.*?(\s*?.*?)*?</ul>%', //itd

oba działają.
grzegosh
Tak, potwierdzam, działa tak samo jak Wicepsika kod, aczkolwiek dalej uzyskuję tylko Array().
Jak uzyskać tę część strony, co robię źle, bo nie mogę dojść...
Wicepsik
U mnie wyświetliło tak smile.gif

  1. Array ( [0] =>
  2.  
  3. * Hiszpania - Irak "akcja po akcji"
  4. * El. ME: dzi mecz ostatniej szansy dla Polakw
  5. * Puchar Konfederacji: Hiszpanie bij gow w iracki mur
  6. * Zawodnik Legii sprzedany do klubu Serie A
  7. * F1: ostateczne stanowisko teamw - "nie chcemy odchodzi, chcemy startowa"
  8. * Pi�� ofert dla polskiego bramkarza Arsenalu
  9. * ATP w Eastbourne: "Matka" i "Frytka" w pfinale
  10. * Angielska prasa broni Howarda Webba
  11.  
  12. [1] => > )


Więc ty masz źle, nie ja smile.gif
grzegosh
Wicepsik, mógłbyś wkleić cały Twój kod? Może mam literówkę gdzieś, lub coś w ten deseń...
Moj wygląda tak:
  1. <?php
  2. $subject = file_get_contents("http://www.onet.pl");
  3. preg_match('/<ul id="nsg_box_sport">.*?(s*?.*?)*?</ul>/', $subject, $matches);
  4.  
  5.  
  6. echo "<br /><br />";
  7. print_r ($matches);
  8. ?>
ernie242
a skąd uruchamiasz ten skrypt ? Problem może być z połączeniem z onet.pl.
var_dump ($subject); żeby zobaczyć czy tak jest.
grzegosh
localhost. Strona pobiera się wporządku, po dumpie: string(81005) i dalej onet cały.
ernie242
nie ma literówek, o dziwo powinno działać.
Jedyne co przychodzi na myśl to problem z kodowaniem znaków... choć to mało prawdopodobne...
grzegosh
No nie działa mi, ani na webservie ani na vertrigo :/ już tego nie rozumiem, co źle robie?
Mógłby ktoś skopiować ów kod i wypróbować u siebie na localhoscie?
Albo mógłby ktoś napisać jakieś inne wyrażenie regularne pobierające dane z jakiejś innej strony, żebym wypróbował u siebie?
Dziwna sprawa...
cojack
  1. <?php
  2.  ini_set("display_errors", 1);
  3. ?>

i sie dowiesz dlaczego masz puste Array
grzegosh
cojack nic sie nie wyświetla. Wklejałem Twój kod na początku skryptu, na końcu - nic się nie wyświetliło prócz Array()
Podmieniłem na wp.pl, zmienilem wyrażenie regularne i dalej Array().
Na prawdę, nie mam pojęcia co może być źle...
erix
Cytat
Podmieniłem na wp.pl, zmienilem wyrażenie regularne i dalej Array().

Pokaż jak to wyświetlasz.
grzegosh
  1. <?php
  2. $subject = file_get_contents("http://www.wp.pl");
  3. preg_match('/<ul id="bxSportLista">.*?(s*?.*?)*?</ul>/', $subject, $matches);
  4.  
  5.  
  6. echo "<br /><br />";
  7. print_r ($matches);
  8. ?>

Ten kod, ten wyżej z onetem... ani jeden, ani drugi. Zmieniłem adres na stronę, którą wykonywałem dla firmy, napisana była w htmlu. Chciałem pobrać odpowiednie elementy ale dalej to samo, ani błędu, ani nic, tylko Array(). Nothing else...
Fifi209
Może tak:

Kod
'/<ul id=\"bxSportLista\">.*?(\s*?.*?)*?<\/ul>/i'
grzegosh
Nic... Prócz Array()
  1. <?php
  2. $subject = file_get_contents("http://www.wp.pl");
  3. preg_match(' /<ul id=\"bxSportLista\">.*?(s*?.*?)*?</ul>/i', $subject, $matches);
  4.  
  5.  
  6. echo "<br /><br /><pre>";
  7. print_r ($matches);
  8. echo "</pre>";
  9. ?>

Może to ktoś skopiować i zapisać dokładnie tak jak jest? Wtedy będzie pewne, czy to wina mojego skryptu czy raczej wina np apacha, choć nie wiem dlaczego... bo jak robie echo $subject; wyswietla całą strone... Czyli jakby preg_match cos nie tak robiło, mimo, że zmienna matches ustawia sie jako tablica...
cojack
spróbuj tym http://pl.php.net/manual/en/class.domdocument.php
grzegosh
Oj, nie miałem nigdy styczności z DOM, na razie nie chciałbym się zagłębiać w to, bo wydaje się skomplikowane. Prosiłbym tylko o sprawdzenie tego co wkleiłem wyżej, czy to faktycznie działa i to apache winny jest, czy też wina leży w skrypcie. Podziękować smile.gif
ernie242
dokładnie ten sam kod co podałeś teraz wkleiłem i działa bez problemu z konta. (za kompa nie idzie, pewnie jakieś ustawienie Apache mam nie teges). Wynik:

Cytat
Array
(
[0] =>

* Dwie atrakcyjne oferty dla pi�karza Lecha. Pobij� transferowy rekord Ekstraklasy?!
* PK: niechciany przez Legi� prowadzi do zwyci�stwa!
* LM: decyzja ws kontrowersyjnego pó�fina�u Chelsea - Barca!
* EL. ME: Polska rozbi�a rywali. Awans jest blisko
* Takiej oferty Jerzy Dudek si� nie spodziewa�!
* Agnieszka Radwa�ska wygra�a w 13 minut!
* Szalony trener! Co rok ucieka od niego 7 zawodnikĂłw
* Chelsea w��cza si� do walki o czarodzieja. Ma si� uda�!
* Zaszokowa� szybkim transferem do Polski. Co go skusi�o?
* Niesamowity rekord w Polsce! "Super, super, super"
* Boruc do FC Barcelony? Zaistnia�a niepowtarzalna szansa
* B�d� wzmocnienia z Brazylii dla pi�karskiej kadry Polski


[1] => >
)
golaod
  1. <?php
  2. $dom = new DOMDocument();
  3.  
  4. $html = file_get_contents( 'http://wp.pl' );
  5.  
  6. $dom->loadHTML( $html );
  7.  
  8. foreach( $dom->getElementsByTagName( 'ul' ) as $ul ) {
  9.  if( $ul->getAttribute( 'id' ) = 'id_tego_ula' ) {
  10.    echo $ul->nodeValue;
  11.  }
  12. }
  13. ?>
grzegosh
Ok, więc coś tam wypisuje, z błędami, aczkolwiek wypisuje smile.gif Błędy wygladają tak, jest ich więcej, ale nie chciałem zaśmiecać:

Warning: DOMDocument::loadHTML() [function.DOMDocument-loadHTML]: End tag : expected '>' in Entity, line: 809 in C:\Program Files\VertrigoServ\www\cwiczenia\index.php on line 17
Warning: DOMDocument::loadHTML() [function.DOMDocument-loadHTML]: Unexpected end tag : scr in Entity, line: 809 in C:\Program Files\VertrigoServ\www\cwiczenia\index.php on line 17
Warning: DOMDocument::loadHTML() [function.DOMDocument-loadHTML]: Unexpected end tag : script in Entity, line: 1477 in C:\Program Files\VertrigoServ\www\cwiczenia\index.php on line 17
Warning: DOMDocument::loadHTML() [function.DOMDocument-loadHTML]: End tag : expected '>' in Entity, line: 1555 in C:\Program Files\VertrigoServ\www\cwiczenia\index.php on line 17

W każdym bądź razie, dzięki - to działa smile.gif
ernie242 Tobie też dzięki, wiem, że ten skrypt działa, tylko na apache coś nie chce chodzić smile.gif
Reszta "dziękówek" również poleciała. Pozdrawiam.



erix
Cytat
Błędy wygladają tak, jest ich więcej, ale nie chciałem zaśmiecać:

Takie błędy wychodzą, gdy HTML się nie waliduje. Trzeba by było wyciągać wyrażeniami; np. phpQuery.
golaod
Wywala błędy bo najwidoczniej jest źle otagowana strona.
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.