Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czemu tablica jest pusta podczas pobierania danych?
Forum PHP.pl > Forum > PHP
Saki
Witam, mam dość dziwny problem z którym męnczę się dość długo, i postanowiłem zapytać na forum.
A więc.

Mam wyrażenie regularne które tak jakby działa, ale nie dokońca.

  1. preg_match_all("#<a href=\"/Profile/user_(.*).html\">(.*)</a>
  2. (.*) <a href=\"(.*)\">(.*)</a>#", $powiadomienia_tmp, $infos);


Podczas pobierania danych przez curl i przepuszczenie ich przez to wyrażenie regularne to tablica jest pusta.
Nawet gdy zapisze dane pobrane przez curl do MySQL i próbuje przepuscić źródło strony z MySQL to tablica też jest pusta.

Ale gdy źródło strony znajduje się w zmiennej na stronie to wyrażenie regularne działa.
Tutaj źródło strony: http://www.pastebin.pr0geek.com/view/5120ff09

Działa tylko kiedy zrobię:

  1. $strona = "CALE ŹRÓDŁO STRONY TUTAJ";
  2.  
  3. preg_match_all("#<a href=\"/Profile/user_(.*).html\">(.*)</a>
  4. (.*) <a href=\"(.*)\">(.*)</a>#", $strona, $infos);
  5.  
  6. print_r($infos); //pokazuje to co ma pokazywać
  7.  


Bardzo proszę o pomoc aby działało też to:

  1. $sql=mysql_query("SELECT * FROM tmp LIMIT 1");
  2. while($row=mysql_fetch_array($sql))
  3. {
  4. $powiadomienia_tmp = $row['tmp'];
  5. }
  6.  
  7. preg_match_all("#<a href=\"/Profile/user_(.*).html\">(.*)</a>
  8. (.*) <a href=\"(.*)\">(.*)</a>#", $powiadomienia_tmp, $infos);
  9.  
  10. print_r($infos); // pokazuje pustą tablice
wookieb
A powiedz co robi preg_match_all?
Saki
Cytat(wookieb @ 20.02.2012, 07:29:02 ) *
A powiedz co robi preg_match_all?


Mam kilka elementów i chce aby każdy był w tabeli dlatego używałem preg_match_all

Wiesz może jak to naprawić aby działało?smile.gif
PS. to mi działa:

  1. preg_match_all("#<span class=\"data\">(.*)</span>#", $powiadomienia_tmp, $data);
  2. preg_match_all("#<input type=\"hidden\" name=\"notification_id\" value=\"(.*)\"/>#", $powiadomienia_tmp, $id);


tylko to nie działa:

  1. [php] preg_match_all("#<a href=\"/Profile/user_(.*).html\">(.*)</a>
  2. (.*) <a href=\"(.*)\">(.*)</a>#", $powiadomienia_tmp, $infos);
[/php]
by_ikar
Zamiast bawić się wyrażeniami, radzę ci pobawić się DOM'em, który również pobierze ci tablicę wszystkich elementów które "dopasuje".
Saki
Cytat(by_ikar @ 20.02.2012, 08:27:08 ) *
Zamiast bawić się wyrażeniami, radzę ci pobawić się DOM'em, który również pobierze ci tablicę wszystkich elementów które "dopasuje".


A wierz jak to zrobić moim przykładem? Bo moje wyrażenie regularne działa, ale nie działa podczas pobierania przez curl czy mysql.

Jak zrobić wyrazenie regularne z wieloma liniami?
  1. preg_match_all("# </div>
  2. <a href=\"/Profile/user_([0-9]*).html\">(.*)</a>
  3. (.*) <a href=\"(.*)\">(.*)</a>
  4.  
  5. <br />#", $powiadomienia_tmp, $infos_more);
piotr.mroczek
poczytaj o flagach. jest w dok. polecenia na php.net
potrzebna Ci jest flaga która kwalifikuje znak nowej lini do . we wzorcu.
by_ikar
Cytat
A wierz jak to zrobić moim przykładem?


http://simplehtmldom.sourceforge.net/ jak pobierzesz, znajdziesz w przykładach jak możesz pobrać to czego ci potrzeba. Jeżeli szukany element nie zawiera jakiegoś identyfikatora, którego mógłbyś się złapać, próbuj łapać rodzica tego elementu, a następnie pobrać dopiero ten element.

A w twoim przypadku, o ile szukasz tylko linków, taki kod może wyglądać tak:

  1. // Find all links
  2. foreach($html->find('a') as $element)
  3. echo $element->href . '<br>';


Jeżeli mimo wszystko chciałbyś to zrobić w wyrażeniu regularnym, można byto zrobić tak: http://gskinner.com/RegExr/?302gn zaznaczone są elementy które zostaną złapane. Twój kod php może wyglądać tak:

  1. preg_match_all('#<a href="([^>]+)"[^>]*>([^<]+)</a>#s', $str, $matches);
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.