Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Skrypt pobierajacy META TAGI
Forum PHP.pl > Forum > Przedszkole
bardzo_poczatkujacy
Witam, jestem prawie zielony w temacie php ale zawsze chcialem sie tego nauczyc.
Na poczatku postanowilem napisac skrypt ktory bedzie pobieral meta tagi z adresu strony wpisanej tutaj:

  1. <form method="POST" action="meta.php">
  2. <p>Podaj adres strony:</p>
  3. <p><input type="text" name="adres" size="44" value="http://"></p>
  4. <p><input type="submit" value="OK"></p>


I wyswietlal je w formularzu:

  1. <html>
  2.  
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-2">
  5. <meta http-equiv="Content-Language" content="pl">
  6. <title>Dodawanie</title>
  7. </head>
  8.  
  9. <body>
  10.  
  11. <?php
  12.  
  13.  
  14. $przedrostek = 'http://';
  15.  
  16. $pos = strpos($HTTP_POST_VARS['adres'], $przedrostek);
  17.  
  18.  
  19. if ($pos === false) {
  20. $tags = get_meta_tags('http://'.$HTTP_POST_VARS['adres']);
  21.  
  22. $wyswietlany_adres = ('http://'.$HTTP_POST_VARS['adres']);
  23.  
  24. }
  25. else {
  26. $tags = get_meta_tags($HTTP_POST_VARS['adres']);
  27.  
  28. $wyswietlany_adres = ($HTTP_POST_VARS['adres']);
  29.  
  30. }
  31.  
  32. ?>
  33.  
  34.  
  35. <p>Tytuł: ?</p>
  36. <p>Adres strony:</p>
  37. <p><a target="blank" href="<? echo $wyswietlany_adres?>"><?php echo $wyswietlany_adres?></a></p>
  38. <p>Opis strony:</p>
  39. <p><textarea rows="8" name="opis" cols="23"><? echo $tags['description'];?></textarea></p>
  40. <p>Słowa kluczowe:</p>
  41. <p><textarea rows="4" name="slowakluczowe" cols="23"><? echo $tags['keywords'];?></textarea></p>
  42. </form>
  43.  
  44. </body>
  45.  
  46. </html>


Skrypt jest dosyc prymitywny poniewaz moja wiedza jest ogranicza ale dziala.
Chcialem jednak wprowadzic kilka udoskonalen ktorych nie moglem nigdzie znalezc lub jezeli znalazlem dostosowac do tego skryptu:
1. Co zrobic zeby skrypt pobieral tez title strony?
2. Co zrobic zeby w polach formularza zamiast polskich znakow nie pojawialo sie "şó"

Oczywiscie dane sa pobierane tylko w przypadku wpisania poprawnego adresu.
Rowniez byl bym wdzieczny o opisanie jak zrobic sprawdzanie poprawnosci tego adresu i wyswietlania np. "Bledny adres" w przypadku podania np. "www.wp.p" lub gdzie moge o tym przeczytac.

No i ostatnia rzecz - zalozmy ze strona ktorej adres podano jest chwilowo nie dziala, wtedy skrypt wywala blad ale wyswietla formularz w ktorym powinny byc dane. Ok chcialbym zeby wyswietlal formularz zeby osoba mogla sama uzupelnic ten formularz, ale zeby nie pokazywal tego bledu

Hmm nie wiem czy nie wymagam za duzo, ale moze znajdzie sie jakis dobry samarytanin tongue.gif

Skrypt mozna przetestowac tu:

http://kazek.follownet.pl/
Wicepsik
W 37 linijce nie napisałeś średników za zmiennymi.
kfc4
1. $tags['title'] nie działa? Jak nie to wejdź na get_meta_tags i poczytaj komentarze.
2. To jest kwestia kodowania. iconv.
A co do sprawdzania adresów:
  1. function sprawdz_url($url) { // SPRAWDZA CZY DANA STRONA ISTNIEJE
  2.  
  3. if (!eregi("/",$url)) {
  4. $url = $url."/";
  5. }
  6.  
  7. $adres[0] = substr($url, 0,strpos($url,"/"));
  8. $adres[1] = substr($url, strpos($url,"/"));
  9. $f=@fsockopen($adres[0], "80");
  10. $odp="";
  11. if ($f) {
  12. fputs($f, "HEAD " . $adres[1] . " HTTP/1.0rnrn");
  13. while(!feof($f)) {$odp .= fgets($f,1024); }
  14. fclose($f);
  15. }
  16. if (eregi("HTTP/1.. 200",$odp)) { // jeśli naglowek zawiera 200
  17. return true;
  18. }
  19. else { // nadal blad
  20.  
  21. $host=str_replace("http://","",$url);
  22. $host=str_replace("www.","",$host);
  23. $host=split("/",$host);
  24.  
  25. $host=split(".", $host[0]);
  26. $ile=count($host);
  27. $host=$host[$ile-2].".".$host[$ile-1];
  28.  
  29. if (@checkdnsrr($host, MX)) { // jesli sprawdzil dns'a i jest ok
  30. return true;
  31. }
  32. else { // jesli nadal stronki nie ma
  33. $otworz = @fopen($url, "r");
  34. if ($otworz) {
  35. return true;
  36. }
  37. else {
  38. return false;
  39. }
  40. }
  41. }
  42. }

Nie pamiętam skąd jest ta funkcja, nie sprawdzałem jej więc może nie działać.
bardzo_poczatkujacy
Ok udalo mi sie dorzucic pobieranie title, $tags['title'] nie dziala bo get_meta_tags nie pobiera title,
Pobieranie title wyglada tak:

  1. $page=false;
  2.  
  3. $meta=array("title"=>"");
  4.  
  5. if(function_exists("file_get_contents"))
  6.  
  7. $page = @file_get_contents($wyswietlany_adres);
  8.  
  9. if (is_string($page)) {
  10. preg_match('/<title>([^>]*)<\/title>/si', $page, $title );
  11. if (isset($title) && is_array($title) && count($title) > 0) {
  12. $meta['title'] = strip_tags($title[1]);
  13. }
  14. }


Jednak dalej nie wiem jak zrobic reszte rzeczy :/
kfc4
Ok, co do kodowania: Ty swoją stronę kodujesz w ISO-8859-2, ale możesz pobierać ze strony zakodowanej w np. UTF-8. Więc tu już jest różnica kodowań. Musisz to UTF-8 ze strony 'przekodować' do to Twoje ISO-8859-2. Robisz to za pomocą iconv. Możesz sprawdzić poprawność adresu za pomocą wyrażeń regularnych. Tu Ci pomoże Google. Nie sprawdzisz jednak czy ona chwilowo nie działa. Albo działa, albo nie. Sprawdzisz to tak:
  1. #
  2. $otworz = @fopen($url, "r");
  3. if ($otworz) {
  4. return true;
  5. }
  6. else {
  7. return false;
  8. }
bardzo_poczatkujacy
Uzylem iconv:

  1. $meta['title'] = iconv("UTF-8","ISO-8859-2", $meta['title']);
  2. $tags['keywords'] = iconv("UTF-8","ISO-8859-2", $tags['keywords']);
  3. $tags['description'] = iconv("UTF-8","ISO-8859-2", $tags['description']);


Tak to powinno wygladac?

Ponizej wklejam kod jak to wszystko teraz wyglada jednak nie wiem jak uzyc @fopen,
zaleznie od tego w jakim miejscu go wstawie pokazuja sie rozne bledy, jest to od tego ze
wszystko jest w jednym ciagu. Nie wiem zabardzo jak to podzielic na funkcje, chodzi o to zeby najpierw:

byla funkcja sprawdzajaca czy wpisano adres, jezeli nie wpisano to zeby pokazywalo blad zeby wpisac,
jezeli wpisano to zeby sprawdzalo czy ten adres dziala, jezeli dziala to zeby pobieralo itd.

Nie wiem jak to wszystko zrobic, czy uzyc if i elseif ? czy uzyc function? czy porobic to w odzielnych plikach i uzyc inlude?
Chodzi mi o ogolna organizacje tego calego kodu, nie wiem czego uzyc,
jezeli ktos moglby go jakos zoptymalizowac albo jakos mnie naprowadzic...?

  1. <?php
  2.  
  3. if ($HTTP_POST_VARS['adres'] == "http://" || $HTTP_POST_VARS['adres'] == "") {
  4.  
  5. echo 'Wpisz adres!';
  6. return;
  7.  
  8. }
  9.  
  10. else {
  11.  
  12. $przedrostek = 'http://';
  13. $pos = strpos($HTTP_POST_VARS['adres'], $przedrostek);
  14.  
  15. if ($pos === false) {
  16.  
  17. $tags = get_meta_tags('http://'.$HTTP_POST_VARS['adres']);
  18. $wyswietlany_adres = ('http://'.$HTTP_POST_VARS['adres']);
  19.  
  20. }
  21.  
  22. else {
  23.  
  24. $tags = get_meta_tags($HTTP_POST_VARS['adres']);
  25. $wyswietlany_adres = ($HTTP_POST_VARS['adres']);
  26.  
  27. }
  28.  
  29. $page=false;
  30. $meta=array("title"=>"");
  31. if(function_exists("file_get_contents"))
  32. $page = @file_get_contents($wyswietlany_adres);
  33. if (is_string($page)) {
  34. preg_match('/<title>([^>]*)<\/title>/si', $page, $title );
  35. if (isset($title) && is_array($title) && count($title) > 0) {
  36. $meta['title'] = strip_tags($title[1]);
  37. }
  38. }
  39.  
  40. }
  41.  
  42.  
  43. $meta['title'] = iconv("UTF-8","ISO-8859-2", $meta['title']);
  44. $tags['keywords'] = iconv("UTF-8","ISO-8859-2", $tags['keywords']);
  45. $tags['description'] = iconv("UTF-8","ISO-8859-2", $tags['description']);
  46.  
  47.  
  48. ?>




Ok wszystko dziala, trzeba bylo troche zmodyfikowac kod i do sprawdzania poprawnosci adresu uzyc:

  1. $handle = @fopen($wyswietlany_adres,'r');
  2. if($handle == false){
  3. die('Bledny adres lub podana strona nie odpowiada');
  4. return;
  5.  
  6. } else {


Mozna zamknac smile.gif
kfc4
Ok, tylko zakładasz, że każda strona jest utf-8, ale może mieć każde inne kodowanie. Podpowiem, że kodowanie jakie jest użyte na stronie, w większości przypadków znajdziesz tu:
  1. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-2">


Ok, teraz parę innych błędów.
  1. if ($HTTP_POST_VARS['adres'] == "http://" || $HTTP_POST_VARS['adres'] == "") {
  2.  
  3. echo 'Wpisz adres!';
  4. return;
  5.  
  6. }
  7.  

Co tu robi return?

  1. $przedrostek = 'http://';
  2. $pos = strpos($HTTP_POST_VARS['adres'], $przedrostek);
  3.  
  4. if ($pos === false) {
  5.  

Nie ma sensu angażować w to dodatkowe zmienne.

Rób wcięcia. Kod stacje się czytelniejszy.

Przepisz całość tworząc funkcję, ale to dodatkowe, jako praca domowa do poćwiczenia.
erix
Cytat
Co tu robi return?

Co tu robi HTTP_POST_VARS?
kfc4
Dobre pytanie, myślałem, że to jest jakiś zamiennik $_POST o którym nie wiem.
bardzo_poczatkujacy
Ok teraz wyglada to tak:

  1. <?php
  2.  
  3. if ($_POST['adres'] == "http://" || $_POST['adres'] == "") {
  4.  
  5. echo '<a href="index.htm"">Popraw</a><br>';
  6. die('Wpisz adres strony!');
  7.  
  8. }
  9.  
  10. else {
  11.  
  12. $przedrostek = 'http://';
  13. $pos = strpos($_POST['adres'], $przedrostek);
  14.  
  15. if ($pos === false) {
  16. $wlasciwy_adres = ('http://'.$_POST['adres']);
  17.  
  18. }
  19.  
  20. else {
  21. $wlasciwy_adres = ($_POST['adres']);
  22.  
  23. }
  24.  
  25. $handle = @fopen($wlasciwy_adres,'r');
  26. if($handle == false){
  27.  
  28. echo '<a href="index.htm"">Popraw</a><br>';
  29. die('Błędny adres lub podana strona nie odpowiada!');
  30.  
  31.  
  32. } else {
  33.  
  34. $tags = get_meta_tags($wlasciwy_adres);
  35.  
  36. $page=false;
  37. $meta=array("title"=>"");
  38. if(function_exists("file_get_contents"))
  39. $page = @file_get_contents($wlasciwy_adres);
  40. if (is_string($page)) {
  41. preg_match('/<title>([^>]*)<\/title>/si', $page, $title );
  42. if (isset($title) && is_array($title) && count($title) > 0) {
  43. $meta['title'] = strip_tags($title[1]);
  44. }
  45. }
  46. }
  47. }
  48.  
  49. $meta['title'] = iconv("UTF-8","ISO-8859-2", $meta['title']);
  50. $tags['keywords'] = iconv("UTF-8","ISO-8859-2", $tags['keywords']);
  51. $tags['description'] = iconv("UTF-8","ISO-8859-2", $tags['description']);
  52.  
  53.  
  54. ?>


Tak wiec jedyne co nie dziala poprawnie to kwestia tego kodowania. Jezeli strona jest w UTF to wszystko dziala ale jak juz jest np w ISO to ucina od momentu pojawienia sie polskiego znaczka. Wiec chyba trzeba skrypt ktory bedzie wykrywal rodzaj kodowania na danej stronie i w zaleznosci od tego jakie jest zamienial na jakies. Trzeba tez uwzglednic ze na niektorych strona w ogole moze nie byc tej informacji podanej
Tylko jak to wszystko zrobic to juz nie wiem sciana.gif
erix
Cytat
Trzeba tez uwzglednic ze na niektorych strona w ogole moze nie byc tej informacji podanej

A przyjrzyj się nagłówkowi content-type.
bardzo_poczatkujacy
Prosilby tylko o skrypt ktory pobiera wartosc "charset" z danej strony i przypisuje ja do powiedzmy $kodowanie...
kfc4
A czytałeś to co napisałem wcześniej? Poza tym stronie niekoniecznie musi być na http, może być równie dobrze na https.

// Wrażenia regularne <- do pytania wyżej.
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.