Wyciąganie adresów filmów z YouTube zamieszczonych w tekście

15 grudnia 2010

Temat YouTube przypadkowo pojawia się na moim blogu drugi raz w krótkim czasie. Nie wiedziałem jaki tytuł nadać temu newsowi, najlepiej będzie gdy na przykładzie wytłumaczę w czym dzisiaj chciałbym Wam pomóc :)

Na nasztomaszow.pl w treści artykułów można oczywiście wpisywać kod HTML. Co za tym idzie, nie ma problemu ze wstawianiem filmików z YouTube. Problem z takim rozwiązaniem jest wtedy gdy chcielibyśmy móc jakoś zarządzać tymi filmami, zrobić ich katalog etc. Nie ma się czego uczepić bo filmy nie są zapisane w bazie w jakiś uporządkowany sposób.

Można byłoby utworzyć katalog filmów a potem wymyślić jakieś znaczniki np. BBCode i za ich pomocą umieszczać filmy w treści artykułów. To byłoby jednak kłopotliwe. Najprościej wejść na stronę filmu, skopiować kod HTML i zapomnieć o całej sprawie.

Nie pozostaje nam nic innego jak przetworzyć tekst i wyciągnąć z HTML'a potrzebne adresy. Oto gotowe rozwiązanie:

PHP:
  1. preg_match_all('@youtube\.(?:com|pl)/(?:watch\?v=|v/){1}([^&?#/"<]+)@si', $body, $youtube);
  2.  
  3. if(isset($youtube[1]) AND is_array($youtube[1]) AND !empty($youtube[1])) {
  4.  
  5.   $youtube = array_unique($youtube[1]);
  6.  
  7.   // wsadzamy informacje do bazy danych
  8. }

W zmiennej $body jest tekst gdzie może znajdować się także kod HTML jakiegoś filmu z YouTube (lub filmów, może ich być wiele ale może nie być żadnego). Wyrażenie wyciąga identyfikatory filmów, ostatecznie pojawiają się one w tablicy $youtube. Wcześniej upewniamy się jeszcze, że filmy się nie zdublują.

Powyższy kod wyciąga adresy filmów zarówno z HTML, który odpowiada za umieszczenie odtwarzacza na stronie jak i ze zwykłych odnośników do strony youtube.com.

W ten prosty sposób mamy informacje o wszystkich filmach w danym tekście. Identyfikatory możemy zapisać do bazy danych i robić z nimi co nam się podoba.

Konkretny przykład. W poprzednim newsie dodałem swój wywiad na temat osady. Adres tego filmu to http://www.youtube.com/watch?v=CGzTCNn5Zos. W takim razie identyfikator filmu to CGzTCNn5Zos. Ta informacja wystarczy nam aby wygenerować gdzie indziej link do tego filmu, kod HTML odtwarzacza czy wstawić screen z filmiku.

Generowanie linku lub kodu odtwarzacza to pikuś. Skupmy się na screenach. Mają one swoje konkretne adresy w postaci http://img.youtube.com/vi/IDENTYFIKATOR/X.jpg gdzie:
IDENTYFIKATOR - Tego chyba nie trzeba tłumaczyć.
X - Cyfra od 0 do 3. 0 to duży, główny screen a 1, 2 i 3 to trzy małe klatki wyciągnięte z filmu.

Przykład:

http://img.youtube.com/vi/CGzTCNn5Zos/0.jpg
http://img.youtube.com/vi/CGzTCNn5Zos/1.jpg
http://img.youtube.com/vi/CGzTCNn5Zos/2.jpg
http://img.youtube.com/vi/CGzTCNn5Zos/3.jpg

Wyrażenia regularne trochę łatwiej…

25 kwietnia 2010

Pewnie wielu z Was, tak jak i ja kiedyś, ma problem z wyrażeniami regularnymi. Przez długi czas znałem tylko ich podstawy nie mogąc przemóc się do dalszej nauki. Każdy przyzna, że ich wygląd potrafi odstraszyć... Oczywiście mimo wszystko polecam kształcenie się w tym kierunku, wyrażenia rozwiązują teraz dla mnie naprawdę skomplikowane czynności. Ale pamiętając swój własny opór przed ich nauką mam dla Was ciekawą alternatywę.

W sieci można znaleźć wiele przykładowych rozwiązań najpopularniejszych problemów. Bez wysiłku znajdziemy wyrażenia do wyciągania adresów email ze stron www, do podlinkowywania adresów www w stringu itd. Problem pojawia się gdy napotykamy na nietypowe zadanie do wykonania. Wtedy musi powstać wyrażenie i albo sam je sobie napiszesz albo ubłagasz kogoś, ewentualnie mu za to zapłacisz :) Czytaj dalej »


Pamiętaj o Ctype Functions

28 października 2009

Kolejna drobna wskazówka dla programistów PHP. W kursach o tym nie przeczytacie :P

Bywa tak, nawet całkiem często, że musimy się upewnić, że w zmiennej mamy np. tylko same cyfry lub małe litery. Pierwsze co wszystkim przychodzi do głowy to wyrażenia regularne. Ale chyba każdy z nas słyszał nie raz przestrogę, że jak można to lepiej unikać wyrażeń bo są wolne. Czy jest jakaś alternatywa?

A jest :P Nazywa się to Character type checking. Funkcji do wyboru jest kilkanaście, przykładowo (za php.net):

PHP:
  1. <?php
  2. $strings = array('1820.20', '10002', 'wsl!12');
  3. foreach ($strings as $testcase) {
  4.     if (ctype_digit($testcase)) {
  5.         echo "The string $testcase consists of all digits.\n";
  6.     } else {
  7.         echo "The string $testcase does not consist of all digits.\n";
  8.     }
  9. }
  10. ?>

Dostaniemy:

CODE:
  1. The string 1820.20 does not consist of all digits.
  2. The string 10002 consists of all digits.
  3. The string wsl!12 does not consist of all digits.

Lista wszystkich dostępnych funkcji znajduje się tutaj, polecam się z nimi zapoznać. Testy wykazują, że funkcje wykonują się znacznie szybciej niż wyrażenia regularne. Funkcje ctype_* są wbudowane w PHP, nie trzeba się martwić o ich dostępność.


Rozszerzone strip_tags()

12 listopada 2008

Ostatnio poprawiałem funkcjonalność get_meta_tags(), teraz przyszedł czas na strip_tags().

Najpierw kilka zdań o samej funkcji strip_tags() (dla tych, którzy jej nie znają chociaż każdy programista PHP znać ją powinien :P ).

Funkcja służy do łatwego, szybkiego i bezbolesnego pozbywania się tagów HTML z tekstu i przyjmuje dwa argumenty. Pierwszy to oczywiście tekst na którym ma pracować a drugi (opcjonalny) to lista tagów, które mają zostać pominięte podczas usuwania.

Przykład:

PHP:
  1. $tekst = 'To jest <b>test</b> działania <i>funkcji</i> strip_tags()';
  2. echo strip_tags($tekst);
  3. echo "\r\n";
  4. echo strip_tags($tekst, '<b>');

Powyższy kod PHP da nam taki wynik:

CODE:
  1. To jest test działania funkcji strip_tags()
  2. To jest </b><b>test</b> działania funkcji strip_tags()

Pierwsze wywołanie funkcji spowodowało usunięcie wszystkich tagów z tekstu. W drugim nakazaliśmy pominąć tagi <b> i tak też się stało.

Niestety czasami funkcja strip_tags() nie wystarcza. Oto przykład problematycznej sytuacji:

PHP:
  1. $tekst = 'Jakiś tekst
  2. <script type="text/javascript">
  3. jakiś kod JavaScript
  4. </script>
  5. dalsza część strony';
  6. echo strip_tags($tekst);

Wynik:

CODE:
  1. Jakiś tekst
  2.  
  3. jakiś kod JavaScript
  4.  
  5. dalsza część strony

Czytaj dalej »


Generowanie bezpiecznych adresów www dla SEO

08 listopada 2008

Standardem stają się ładne, oparte o .htaccess, adresy stron internetowych, tworzone według zasad SEO (Search Engine Optimization - Pozycjonowanie stron internetowych). Przykład to chociażby ten blog. Adres tego wpisu wygląda tak:

CODE:
  1. http://www.tarnaski.eu/blog/generowanie-bezpiecznych-adresow-www-dla-seo

Ale to tylko "przykrywka". Sprytny sposób ukrycia prawdziwego adresu, który prezentuje się tak:

CODE:
  1. http://www.tarnaski.eu/blog/?p=458

Który link wygląda ładniej? :) No właśnie... Wyszukiwarki typu google też wolą ten pierwszy :)

Jednak aby mieć takie adresy trzeba spełnić kilka warunków. Potrzebujemy między innymi funkcji, która zamieni dowolny ciąg znaków na coś co będzie bezpieczne i akceptowalne przez wszystkie wyszukiwarki i przeglądarki Internetowe. Czyli coś co zamieni "Generowanie bezpiecznych adresów www dla SEO" na "generowanie-bezpiecznych-adresow-www-dla-seo". I tym właśnie się zajmiemy :P Czytaj dalej »


Pobieranie meta tagów, część 2

01 listopada 2008

Czas najwyższy zaprezentować bardziej rozbudowaną funkcję od tej, którą pokazałem we wpisie Jak najlepiej pobrać meta tagi jakiejś strony www?.

Wprowadzone zmiany:

  • Z jednej funkcji zrobiły się dwie. Pierwsza odpowiada za prawidłowe odczytanie kodowania strony, druga pobiera resztę meta tagów.
  • Przekonałem się jednak do wyrażeń regularnych a więc jest już tylko jedna wersja kodu, która działa zarówno na PHP 4 jak i PHP 5.
  • Napisałem na nowo wyrażenia regularne. Teraz funkcje są bardziej odporne na błędy osób definiujących meta tagi. Nie przeszkadzają zbędne spacje, różna kolejność wartości, braki cudzysłowów, dodatkowe, niestandardowe wartości itd.

Czytaj dalej »