Jak najlepiej pobrać meta tagi jakiejś strony www?
09 października 2008
Czasami bywa tak, że potrzebujemy pobrać tzw. meta tagi wybranej strony Internetowej. Zaskakująco mało osób wie/pamięta, że PHP ma wbudowaną funkcję, która bardzo dobrze radzi sobie z tym zadaniem. Zwie się ona get_meta_tags() i jest banalna w użyciu. Przyjmuje jeden argument, adres strony Internetowej lub adres lokalnego pliku, natomiast zwraca śliczną tablicę z meta tagami
Niestety, jak to często bywa, jest jedno "ale"
Funkcja get_meta_tags() pobiera tagi tylko o takiej postaci:
-
<meta name="nazwa" content="wartość" />
Mnie natomiast interesuje jeszcze chociażby <title>...</title> *. Muszę więc napisać własny kod, który wyciągnie zawartość tego znacznika. Potrzebuję jednak źródła strony, co za tym idzie, muszę również samemu zamartwić się o zapisanie zawartości witryny do zmiennej.
I tu dochodzimy do wniosku, że jeżeli potrzebujemy z jakiejś strony wyciągnąć coś więcej niż to co potrafi funkcja get_meta_tags() to niestety musimy z niej całkowicie zrezygnować. Inaczej musielibyśmy dwa razy pobierać źródło. Raz zrobi to get_meta_tags() i drugi raz zrobimy to sami aby wyciągnąć inne informacje takie jak chociażby wspomniany wcześniej <title>...</title>. Trochę bez sensu... Niestety do get_meta_tags() nie możemy przekazać stringa z którego dostalibyśmy tablicę z meta tagami, funkcja nie zwraca też w żaden sposób treści na której pracowała.
Napisałem własną funkcję, można ją podzielić na trzy części, które zaraz opiszę.
-
function pobierz_metatagi($tresc) {
-
-
-
if($tresc) {
-
-
// CZESC 1 - pobieranie zawartosci tagu <title>...</title>
-
-
### sposob 1 ###
-
$title_start = stripos($tresc, '<title>');
-
if($title_start !== null) {
-
$title_stop = stripos($tresc, '</title>');
-
if($title_stop !== null AND $title_start <$title_stop) {
-
}
-
}
-
################
-
-
-
### sposob 2 ###
-
-
if($title[1]) {
-
$metatagi['title'] = $title[1];
-
}
-
################
-
-
// CZESC 2 - wyciagamy zwykle meta tagi
-
preg_match_all('/<[\s]*meta[\s]*name="?([^>"]*)"?[\s]*content="?([^>"]*)"?[\s]*[\/]?[\s]*>/si', $tresc, $wynik);
-
-
foreach($wynik[1] AS $key => $value) {
-
}
-
}
-
-
// CZESC 3 - rozbicie slow kluczowych na tablice
-
if($metatagi['keywords']) {
-
-
foreach($keywords AS $tag) {
-
if($tag) {
-
$tagi[] = $tag;
-
}
-
}
-
-
$metatagi['keywords'] = $tagi;
-
}
-
}
-
}
-
-
return $metatagi;
-
}
Pierwsza część to dwa różne sposoby wyciągnięcia zawartości <title>...</title>. W sposobie pierwszym użyłem funkcji stripos() (aby poprawnie radzić sobie z różną wielkością liter) przez co cała funkcja nie zadziała pod PHP 4. Ja pracuję już tylko na PHP 5 a wyrażeń regularnych staram się unikać dlatego wybrałem taki sposób.
Jeżeli ktoś jeszcze nie przesiadł się na piątkę to zadowoli go drugi sposób.
Bez względu na wybraną metodę, należy pamiętać o usunięciu niepotrzebnego sposobu z kodu
Druga część to zasymulowanie działania get_meta_tags(). W rezultacie dostajemy tablicę gdzie klucze to nazwy meta tagów (zawsze z małych liter poprzez użycie strtolower()) a wartości to zawartości tagów.
Trzecia część to już mój wymysł aby dodatkowo słowa kluczowe z tagu keywords podzielić na tablicę. Taką akurat mam potrzebę.
Każdy może tą funkcję zmodyfikować, przystosować do własnych wymogów, coś dodać, coś usunąć. Jako argument funkcja przyjmuje string, nie interesuje jej skąd on tak naprawdę się wziął.
Do pobrania źródła strony www polecam moją funkcję o której pisałem w lutym we wpisie Funkcja pobierająca stronę www. Wyglądałoby to wtedy tak:
-
$tagi = pobierz_metatagi(otworz_adres('http://www.tarnaski.eu'));
Po wywołaniu print_r($tagi) dostaniemy coś takiego:
-
Array
-
(
-
[title] => Mariusz Tarnaski
-
[generator] => WordPress 2.6
-
[description] => Blog na każdy temat chociaż chciałbym się skupić przede wszystkim na mojej pasji jaką jest tworzenie stron Internetowych.
-
[keywords] => Array
-
(
-
[0] => Mariusz
-
[1] => Tarnaski
-
[2] => MariuszT
-
[3] => pozycjonowanie
-
[4] => tworzenie stron www
-
[5] => komputery
-
[6] => internet
-
)
-
-
[verify-v1] => D2ohrgDDepMDX6HH4qxpF3K3tHNuIkINWKWc+VDTqKM=
-
)
Prawda, że wygląda bardzo zgrabnie?
Trzeba się jednak liczyć jeszcze z tym, że różne strony Internetowe mają ustawione różne kodowanie znaków. I na to jest sposób jednak rozwiązanie podam gdy sam dopiszę potrzebny kawałek kodu
Czyli wkrótce
PS
Na szczęście nie musiałem się głowić nad wyżej zapisanymi wyrażeniami regularnymi. Nie są mojego autorstwa, znalazłem je w komentarzach do funkcji get_meta_tags() na php.net.
PS 2
Funkcja get_meta_tags() zwraca błąd jeżeli chcemy nią otworzyć stronę https:// a na serwerze nie mamy włączonej obsługi SSL. Moja funkcja pobierająca stronę www radzi sobie z tym znakomicie
* - tak naprawdę tag <title>...</title> nie jest meta tagiem ale dla uproszczenia, wszyscy zaliczają go do tej grupy.
EDIT 01.11.2009
Tak jak obiecałem, poprawiłem i ulepszyłem powyższą funkcję. Więcej informacji we wpisie Pobieranie meta tagów, część 2.
Blog przede wszystkim o Internecie i mojej pasji jaką jest tworzenie stron www. Ale nie ograniczam się do jednej tematyki, piszę o wszystkim o czym mam ochotę :-)
BeuaT napisał: 04.04.10 o godzinie 20:27
#
#
foreach($keywords AS $tag) {
#
$tag = trim($tag);
#
if($tag) {
#
$tagi[] = $tag;
#
}
– po co to?
MariuszT napisał: 04.04.10 o godzinie 20:34
No w sumie można byłoby się bez tego obejść… Niby usunie puste tagi, spacje ale można to zrobić lepiej. Jak dobrze pamiętam to było kilka różnych wersji tego skryptu i to pewnie jakaś pozostałość. Do poprawienia.