Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Pobieranie title z linka
Majkelo23
post
Post #1





Grupa: Zarejestrowani
Postów: 226
Pomógł: 17
Dołączył: 13.02.2012

Ostrzeżenie: (0%)
-----


Potrzebuję funkcji, która wyciągnie mi title danej strony, jeśli z kolei się nie uda to zwróci po prostu false.
Próbowałem najprostszym sposobem - file_get_contents() - za cholerę nie chce działać. Są wyjątki, np. nk.pl przeczyta, ale onet.pl / interia.pl / wp.pl nie potrafi odczytać, zwraca mi false. Czym to jest spowodowane ?

Kod wygląda tak:

  1. function get_url_title($url)
  2. {
  3. $path = file_get_contents($url);
  4. if ( preg_match('/<title>(.*?)<\/title>/', $path, $array) )
  5. {
  6. return $array[1];
  7. }
  8. else
  9. {
  10. return false;
  11. }
  12. }


Ten post edytował Majkelo23 28.05.2012, 16:17:54
Go to the top of the page
+Quote Post
ethann
post
Post #2





Grupa: Zarejestrowani
Postów: 56
Pomógł: 18
Dołączył: 7.04.2012

Ostrzeżenie: (0%)
-----


Mam parę uwag odnośnie regexpa.
w preg_match() jako ograniczniki wzoru zastosuj np. @ (znak małpy), unikniesz backslashowania często występujących znaków. Znak zapytania nie jest potrzebny, sama gwiazdka oznacza, że chcesz w tym miejscu dowolną ilość elementów (łącznie z jego brakiem).
  1. preg_match('@<title>(.*)</title>@', $path, $array)


ad kodu u mnie wyrzuca warning w przypadku nk.
Cytat
Warning: file_get_contents(http://nk.pl/) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in D:\Programms\wamp\skrypty\getUrlTitle.php on line 5.

Najprawdopodobniej jest parę rzeczy sprawdzanych (chodzi o nagłówki HTTP, np. przeglądarka). Jeśli chcesz z tego serwisu wydobyć adres skorzystaj np. z curl'a i wyślij fałszywe nagłówki.


#edit
U mnie w przypadku WP/Interii/Onet, śmiga bez problemu.

ew. sprawdź czy nie masz ustawionego w php.ini:
allow_url_fopen = Off
ale to raczej odpada bo by Ci nic nie zewnętrznego nie czytało.

Ten post edytował ethann 28.05.2012, 17:16:42
Go to the top of the page
+Quote Post
Majkelo23
post
Post #3





Grupa: Zarejestrowani
Postów: 226
Pomógł: 17
Dołączył: 13.02.2012

Ostrzeżenie: (0%)
-----


  1. <?php
  2.  
  3. function get_url_title($url)
  4. {
  5. $path = @file_get_contents($url);
  6. if ( preg_match('@<title>(.*)</title>@', $path, $array) )
  7. {
  8. return $array[1];
  9. }
  10. else
  11. {
  12. return $url;
  13. }
  14. }
  15.  
  16. echo get_url_title('http://onet.pl');
  17.  
  18. ?>


Efekt: "http://onet.pl" ;/
Go to the top of the page
+Quote Post
ethann
post
Post #4





Grupa: Zarejestrowani
Postów: 56
Pomógł: 18
Dołączył: 7.04.2012

Ostrzeżenie: (0%)
-----


pokaż co zwraca
  1. var_dump(get_url_title('http://onet.pl'));
Go to the top of the page
+Quote Post
Majkelo23
post
Post #5





Grupa: Zarejestrowani
Postów: 226
Pomógł: 17
Dołączył: 13.02.2012

Ostrzeżenie: (0%)
-----


Kod
string(14) "http://onet.pl"


Dodam, że przy http://nk.pl otrzymuję:

Cytat
nk.pl - Serwis społecznościowy nk.pl - platforma komunikacji dla wszystkich internautów


Czyli ok, krzaki sam poprawię.
Go to the top of the page
+Quote Post
ethann
post
Post #6





Grupa: Zarejestrowani
Postów: 56
Pomógł: 18
Dołączył: 7.04.2012

Ostrzeżenie: (0%)
-----


hm no fakt, zwróć zamiast
  1. return $array[1];

to:
  1. return $array;


i wtedy var_dump.
Go to the top of the page
+Quote Post
Majkelo23
post
Post #7





Grupa: Zarejestrowani
Postów: 226
Pomógł: 17
Dołączył: 13.02.2012

Ostrzeżenie: (0%)
-----


Cholera, znalazłem problem. Te wszystkie strony korzystają z 'http://www.'. Jak to zrobić tak uniwersalnie, że w przypadku wymuszonego 'www' skrypt jakoś to przegryzie? Da się to jakoś ugryźć?

EDIT:

I...na odwrót. http://www.nk.pl/ tez nie śmiga. Dopiero po usunięciu 'www.' ;/

Ten post edytował Majkelo23 28.05.2012, 17:36:31
Go to the top of the page
+Quote Post
greycoffey
post
Post #8





Grupa: Zarejestrowani
Postów: 320
Pomógł: 29
Dołączył: 3.04.2010

Ostrzeżenie: (20%)
X----


Musisz podążać za przekierowaniami, lub napisać funkcję sprawdzającą najpierw http://strona.pl potem http://www.strona.pl.
Go to the top of the page
+Quote Post
Majkelo23
post
Post #9





Grupa: Zarejestrowani
Postów: 226
Pomógł: 17
Dołączył: 13.02.2012

Ostrzeżenie: (0%)
-----


Własnie po napisaniu pytania, sam wpadłem na to, że muszę w przypadku niepowodzenia sprawdzić link dla "z www." i "bez www.".

Funkcja jest taka:

  1. function get_url_title($url)
  2. {
  3. $path = @file_get_contents($url);
  4. if ( preg_match('@<title>(.*)</title>@', $path, $array) )
  5. {
  6. return $array[1];
  7. }
  8. else
  9. {
  10. if ( strstr($url, 'www.') == FALSE )
  11. {
  12. $url = str_replace('http://', 'http://www.', $url);
  13. $path = @file_get_contents($url);
  14. if ( preg_match('@<title>(.*)</title>@', $path, $array) )
  15. {
  16. return $array[1];
  17. }
  18. }
  19. else if ( strstr($url, 'www.') !== FALSE )
  20. {
  21. $url = str_replace('www.', '', $url);
  22. $path = @file_get_contents($url);
  23. if ( preg_match('@<title>(.*)</title>@', $path, $array) )
  24. {
  25. return $array[1];
  26. }
  27. }
  28. else
  29. {
  30. return $url;
  31. }
  32. }
  33. }


Ale...nadal nic. Może Wy widzicie jakiegoś byka?

EDIT:

dla http://onet.pl/ już działa - dopisuje "www.". Jednak w przypadku http://www.nk.pl/ - nie chce wywalać tego "www." ;/

Ten post edytował Majkelo23 28.05.2012, 17:49:41
Go to the top of the page
+Quote Post
ethann
post
Post #10





Grupa: Zarejestrowani
Postów: 56
Pomógł: 18
Dołączył: 7.04.2012

Ostrzeżenie: (0%)
-----


Zależy. możesz to zrobić w prosty sposób samemu wpisując 2 adresy (z WWW oraz bez WWW) np.
  1. function get_url_title_x($linka, $linkb) {
  2. if(($ret = get_url_title($linka)) !== false) {
  3. return $ret;
  4. }
  5. else {
  6. return get_url_title($linkb);
  7. }
  8. }
  9.  
  10. get_url_title_x("http://nk.pl/", "http://www.nk.pl/");


Ewentualnie sprawdzić regexp'em czy występuje w linku fragment "www.", jeśli nie to po prostu przygotować 2 zmienne, jedna z wartością normalnego linka, a drugą z takim samym linkiem tylko dopisać do niego "www." zaraz po ukośnikach (http://) i wtedy wykonać np. część zawartą w get_url_title_x (kod który podałem wyżej).
Go to the top of the page
+Quote Post
Majkelo23
post
Post #11





Grupa: Zarejestrowani
Postów: 226
Pomógł: 17
Dołączył: 13.02.2012

Ostrzeżenie: (0%)
-----


Dla http://onet.pl/ już działa - dopisuje "www.". Jednak w przypadku http://www.nk.pl/ - nie chce wywalać tego "www." ;/
Go to the top of the page
+Quote Post
ethann
post
Post #12





Grupa: Zarejestrowani
Postów: 56
Pomógł: 18
Dołączył: 7.04.2012

Ostrzeżenie: (0%)
-----


przede wszystkim włącz ostrzeżenia w php.ini, albo dopisz na górze pliku dopisz error_reporting(E_ALL);
I nie wyciszaj tego co krzyczą funkcję póki kod nie będzie działał poprawnie.
Go to the top of the page
+Quote Post
Majkelo23
post
Post #13





Grupa: Zarejestrowani
Postów: 226
Pomógł: 17
Dołączył: 13.02.2012

Ostrzeżenie: (0%)
-----


Niestety, nic to nie dało.
Go to the top of the page
+Quote Post
IProSoft
post
Post #14





Grupa: Zarejestrowani
Postów: 479
Pomógł: 97
Dołączył: 6.09.2011
Skąd: php.net :)

Ostrzeżenie: (0%)
-----


Gotowa i działająca:

  1. function get_url_title_x($url) {
  2. $curl_options = array(
  3. CURLOPT_FOLLOWLOCATION => true,
  4. CURLOPT_MAXREDIRS => 3,
  5. CURLOPT_RETURNTRANSFER => true,
  6. CURLOPT_UNRESTRICTED_AUTH => true,
  7. CURLOPT_CONNECTTIMEOUT => 30,
  8. CURLOPT_DNS_CACHE_TIMEOUT => 30,
  9. CURLOPT_TIMEOUT => 30,
  10. CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 5.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0'
  11. );
  12. $curl = curl_init();
  13. curl_setopt_array($curl, $curl_options);
  14. curl_setopt($curl, CURLOPT_URL, $url);
  15. $data = curl_exec( $curl );
  16. curl_close( $curl );
  17. if ( preg_match('@<title>(.*)</title>@', $data, $array) )
  18. {
  19. return $array[1];
  20. }
  21. return false;
  22. }


Ten post edytował IProSoft 28.05.2012, 17:56:20


--------------------
Manual prawdę Ci powie.
Go to the top of the page
+Quote Post
Majkelo23
post
Post #15





Grupa: Zarejestrowani
Postów: 226
Pomógł: 17
Dołączył: 13.02.2012

Ostrzeżenie: (0%)
-----


Problem w tym, że mam coś wyłączonego na serwerze, co powoduje, że Twoja funkcja nie działa:

Cytat
Warning: curl_setopt_array() [function.curl-setopt-array]: CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set in /home/


;/ nie bawie się na darmówkach tylko na normalnym hostingu.
Moja funkcja jest nie do poprawy?
Go to the top of the page
+Quote Post
IProSoft
post
Post #16





Grupa: Zarejestrowani
Postów: 479
Pomógł: 97
Dołączył: 6.09.2011
Skąd: php.net :)

Ostrzeżenie: (0%)
-----


Sprawdziłem funkcję z postu: http://forum.php.pl/index.php?s=&showt...st&p=965893 i działa pieknie, dla jakiej strony nie pobiera Ci title?

Usuń wszystkie @ z kodu i daj error_reporting(E_ALL); przed wywołaniem funkcji.


--------------------
Manual prawdę Ci powie.
Go to the top of the page
+Quote Post
Majkelo23
post
Post #17





Grupa: Zarejestrowani
Postów: 226
Pomógł: 17
Dołączył: 13.02.2012

Ostrzeżenie: (0%)
-----


Facet na innym forum też twierdził, że mu działa ta funkcja. Mi z kolei ona nie działa. Inny napisał, że "to kwestia requiestów..." cokolwiek to oznacza.
Go to the top of the page
+Quote Post
IProSoft
post
Post #18





Grupa: Zarejestrowani
Postów: 479
Pomógł: 97
Dołączył: 6.09.2011
Skąd: php.net :)

Ostrzeżenie: (0%)
-----


Niestety nikt bez jakichkolwiek komunikatów/błędów nie będzie mógł raczej znaleźc rozwiązania.


--------------------
Manual prawdę Ci powie.
Go to the top of the page
+Quote Post
Majkelo23
post
Post #19





Grupa: Zarejestrowani
Postów: 226
Pomógł: 17
Dołączył: 13.02.2012

Ostrzeżenie: (0%)
-----


Ta, tylko że ja nie mam żadnych błędów/komunikatów, tyle tylko że nie pobiera mi tego title. Kod, który kazałeś dodać dodałem i napisałem pare postów wcześniej - nic to nie zmieniło.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 10:24