PHP: Funkcja generująca przyjazne linki

Autor: Arkadiusz Tobiasz 31 marca 2010

W jednym z poprzednich wpisów przedstawiłem jak tworzyć „przyjazne linki” za pomocą mod_rewrite. W dzisiejszym wpisie chciałbym Wam przedstawić obiecaną funkcję, która będzie konwertować zwykłe linki do linków w „przyjaznej postaci”.

„Przyjazne linki” zazwyczaj składają się z tytułu dokumentu, np. tytułu newsa i jego identyfikatora. Korzystając z tytułów dokumentów musimy go odpowiednio przygotować pozbywając się niepotrzebnych znaków oraz zmienić polskie znaki dialektyczne. Wykorzystamy do tego specjalnej funkcji, która będzie pozbywać się ze zmiennej wejściowej wszystkich polskich literek zamieniając je na literki bez ogonków.

1
2
3
4
5
6
7
8
9
10
11
function ClearPolishSigns($text)  
{  
     $ReplacePolishSign = array(  
         'ą' => 'a', 'Ą' => 'A', 'ę' => 'ę', 'Ę' => 'E',  
         'ć' => 'c', 'Ć' => 'C', 'ń' => 'n', 'Ń' => 'N', 'ł' => 'l',  
         'Ł' => 'L', 'ś' => 's', 'Ś' => 'S', 'ż' => 'z',  
         'Ż' => 'Z', 'ź' => 'z', 'Ź' => 'Z', 'ó' => 'o', 'Ó' => 'o'  
         );  
       
     return str_replace(array_keys($ReplacePolishSign), array_values($ReplacePolishSign), $text);  
}

W powyższym kodzie wykorzystujemy funkcję str_replace(), dzięki, której zamieniamy wszystkie klucze w tabeli $ReplacePolishSign na przypisane im wartości wykorzystując funkcję array_keys() i array_values(). Teraz możemy przystąpić do napisania funkcji, która będzie zwracać nam tytuł w przyjazny dla wyszukiwarek sposób:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function FriendlyTitle($text)  
{  
    $text = ClearPolishSigns($text);  

    $text = strtolower($text);  

    $text = str_replace(' ', '-', $text);  

    $text = preg_replace('/[^0-9a-z\-]+/', '', $text);  

    $text = preg_replace('/[\-]+/', '-', $text);  

    $text = trim($text, '-');  

    return $text;  
}

Krótki komentarz. W trzeciej linijce pozbywamy się polskich znaków. W piątej linijce wszystkie znaki zamieniamy na małą literę. W siódmej linijce zamieniamy spacje na myślniki. W dziewiątej usuwamy wszystko co nie jest cyfrą, literą lub myślnikiem. W jedenastej linijce usuwamy powtarzające się myślniki. W trzynastej usuwamy, o ile się tam znajdują, myślniki na początku stringa i na jego końcu.

Teraz zastanówmy się w jakiej postaci chcemy wyświetlać „przyjazne linki” na naszej stronie. Ja posłużę się postacią, którą wykorzystuje na swoich stronach internetowych, a mianowicie link:

news.php?op=read&nid=1

zamienimy na:

news/1/tytul-newsa.html

Na wstępnie musimy dokonać odpowiedniego zapisu w pliku .htaccess:

1
2
3
4
RewriteEngine On
RewriteBase /

RewriteRule ^[a-z0-9\-]+/s([0-9]+)/[a-z0-9\-]+\.html$ news.php?op=read&nid=$1

Funkcja generująca w końcu kompletny „przyjazny link” prezentuje się następująco:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function urlFriend($name, $module, $id, $additional='', $page='')  
{  
    if(empty($additional) && empty($page)) {
        $url = '%s/%d/%s.html';      
        $name = FriendlyTitle($name);  

        $result = sprintf($url, $module, $id, $name);
    } else {
        if(empty($additional)) {

            $url = '%s/%d/%s/page/%d.html';      
            $name = FriendlyTitle($name);  

            $result = sprintf($url, $module, $id, $name, $page);
        } else {
            if(empty($page)) {
                $url = '%s/%d/%s/%s.html';      
                $name = FriendlyTitle($name);  

                $result = sprintf($url, $module, $id, $name, $additional);
            } else {
                $url = '%s/%d/%s/%s/page/%d.html';      
                $name = FriendlyTitle($name);  

                $result = sprintf($url, $module, $id, $name, $additional, $page);
            }
        }
    }

       
    return $result;  
}

Krótki komentarz nasza funkcja urlFriend() posiadam 5 argumentów w tym 3 obowiązkowe i 2 opcjonalne. Pierwszy to tytuł, np. newsa, drugi to nazwa pliku/modułu, trzeci to identyfikator nadany przez bazę danych, czwarty to dodatkowy tekst i ostatni to numer strony, jeśli korzystamy z numeracji (pisałem o tym wcześniej). W zmiennej $url przedstawiamy strukturę „przyjaznego linku” i wykorzystując funkcję sprintf() podając odpowiednie argumenty otrzymujemy wynik.

Jak korzystać z funkcji? Przykładowe zastosowanie:

1
2
3
4
5
if($friendly_url == 1) {
    $urlFriendly = urlFriend($courtdata[$i]->name, 'baza-sadow', $courtdata[$i]->court_id);
} else {
    $urlFriendly = 'courts.php?op=courts&court_id='.$courtdata[$i]->court_id;
}

Efekt działania możecie zobaczyć tutaj.

komentarze 3

  1. Marek napisał(a):

    Z lenistwa wpisałem w Google i dzięki Tobie gotowe;)

    Dzięki.

    Aby było idealnie można by zamieniać białe znaki na ‚-‚ z regex, na wypadek gdyby było więcej niż jedna spacja.

    Pozdrawiam

  2. progek napisał(a):

    Jest błąd w tablicy $ReplacePolishSign, ‚ę’ => ‚ę’ powinno być ‚ę’ => ‚e’

  3. Bartek napisał(a):

    Warto by było dodać też inne znaki, nie tylko polskie – akcenty itp. Poza tym super, dzięki!

Odpowiedz

 

Arkadiusz Tobiasz student Akademii Ekonomicznej im. Karola Adamieckiego w Katowicach na specjalnościach informatyka ekonomiczna oraz rachunkowość. Więcej...

jQuery Validation i funkcja remote

Jakiś czas temu zwrócił się do mnie użytkownik z problemem. Chodzi o to, że korzysta on z pluginu walidacji jQuery, […]

Zend Framework: integracja z Uploadify

W tym wpisie postaram się przedstawić Wam w jaki sposób zintegrować skrypt Uploadify z Zend Frameworkiem. Dzięki temu będziemy mogli […]

Javascript: Czasowe wyświetlanie reklamy

Czasami chcemy, aby na pewnym elemencie naszej strony wyświetlała się reklama przez jakiś czas, a następnie zniknęła. W tym wpisie […]

Linux: backup wszystkich baz danych MySQL

Swego czasu pisałem o tym jak z poziomu konsoli można szybko i przyjemnie zrobić backup bazy MySQL. Wszystko jest ładnie […]