Php Sef Link Fonksiyonu

Bu fonksiyon ile kullanıcı dostu url’ler oluşturmak için türkçe metinlerinizi derleyebilirsiniz. Tek yapmanız gereken fonksiyona parametre olarak metninizi göndermeniz. Bu sayede dönen değer url’de kullanıma uygun ve düzgün bir değer olacaktır.

/**
* @param $string
* @return mixed
*/
/**
 * @param $str
 * @param array $options
 * @return string
 */
function permalink($str, $options = array())
{
    $str = mb_convert_encoding((string)$str, 'UTF-8', mb_list_encodings());
    $defaults = array(
        'delimiter' => '-',
        'limit' => null,
        'lowercase' => true,
        'replacements' => array(),
        'transliterate' => true
    );
    $options = array_merge($defaults, $options);
    $char_map = array(
        // Latin
        'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A', 'Å' => 'A', 'Æ' => 'AE', 'Ç' => 'C',
        'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I',
        'Ð' => 'D', 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ö' => 'O', 'Ő' => 'O',
        'Ø' => 'O', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U', 'Ű' => 'U', 'Ý' => 'Y', 'Þ' => 'TH',
        'ß' => 'ss',
        'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'a', 'å' => 'a', 'æ' => 'ae', 'ç' => 'c',
        'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i',
        'ð' => 'd', 'ñ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'o', 'ő' => 'o',
        'ø' => 'o', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ü' => 'u', 'ű' => 'u', 'ý' => 'y', 'þ' => 'th',
        'ÿ' => 'y',
        // Latin symbols
        '©' => '(c)',
        // Greek
        'Α' => 'A', 'Β' => 'B', 'Γ' => 'G', 'Δ' => 'D', 'Ε' => 'E', 'Ζ' => 'Z', 'Η' => 'H', 'Θ' => '8',
        'Ι' => 'I', 'Κ' => 'K', 'Λ' => 'L', 'Μ' => 'M', 'Ν' => 'N', 'Ξ' => '3', 'Ο' => 'O', 'Π' => 'P',
        'Ρ' => 'R', 'Σ' => 'S', 'Τ' => 'T', 'Υ' => 'Y', 'Φ' => 'F', 'Χ' => 'X', 'Ψ' => 'PS', 'Ω' => 'W',
        'Ά' => 'A', 'Έ' => 'E', 'Ί' => 'I', 'Ό' => 'O', 'Ύ' => 'Y', 'Ή' => 'H', 'Ώ' => 'W', 'Ϊ' => 'I',
        'Ϋ' => 'Y',
        'α' => 'a', 'β' => 'b', 'γ' => 'g', 'δ' => 'd', 'ε' => 'e', 'ζ' => 'z', 'η' => 'h', 'θ' => '8',
        'ι' => 'i', 'κ' => 'k', 'λ' => 'l', 'μ' => 'm', 'ν' => 'n', 'ξ' => '3', 'ο' => 'o', 'π' => 'p',
        'ρ' => 'r', 'σ' => 's', 'τ' => 't', 'υ' => 'y', 'φ' => 'f', 'χ' => 'x', 'ψ' => 'ps', 'ω' => 'w',
        'ά' => 'a', 'έ' => 'e', 'ί' => 'i', 'ό' => 'o', 'ύ' => 'y', 'ή' => 'h', 'ώ' => 'w', 'ς' => 's',
        'ϊ' => 'i', 'ΰ' => 'y', 'ϋ' => 'y', 'ΐ' => 'i',
        // Turkish
        'Ş' => 'S', 'İ' => 'I', 'Ç' => 'C', 'Ü' => 'U', 'Ö' => 'O', 'Ğ' => 'G',
        'ş' => 's', 'ı' => 'i', 'ç' => 'c', 'ü' => 'u', 'ö' => 'o', 'ğ' => 'g',
        // Russian
        'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ё' => 'Yo', 'Ж' => 'Zh',
        'З' => 'Z', 'И' => 'I', 'Й' => 'J', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O',
        'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C',
        'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sh', 'Ъ' => '', 'Ы' => 'Y', 'Ь' => '', 'Э' => 'E', 'Ю' => 'Yu',
        'Я' => 'Ya',
        'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'yo', 'ж' => 'zh',
        'з' => 'z', 'и' => 'i', 'й' => 'j', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o',
        'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c',
        'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sh', 'ъ' => '', 'ы' => 'y', 'ь' => '', 'э' => 'e', 'ю' => 'yu',
        'я' => 'ya',
        // Ukrainian
        'Є' => 'Ye', 'І' => 'I', 'Ї' => 'Yi', 'Ґ' => 'G',
        'є' => 'ye', 'і' => 'i', 'ї' => 'yi', 'ґ' => 'g',
        // Czech
        'Č' => 'C', 'Ď' => 'D', 'Ě' => 'E', 'Ň' => 'N', 'Ř' => 'R', 'Š' => 'S', 'Ť' => 'T', 'Ů' => 'U',
        'Ž' => 'Z',
        'č' => 'c', 'ď' => 'd', 'ě' => 'e', 'ň' => 'n', 'ř' => 'r', 'š' => 's', 'ť' => 't', 'ů' => 'u',
        'ž' => 'z',
        // Polish
        'Ą' => 'A', 'Ć' => 'C', 'Ę' => 'e', 'Ł' => 'L', 'Ń' => 'N', 'Ó' => 'o', 'Ś' => 'S', 'Ź' => 'Z',
        'Ż' => 'Z',
        'ą' => 'a', 'ć' => 'c', 'ę' => 'e', 'ł' => 'l', 'ń' => 'n', 'ó' => 'o', 'ś' => 's', 'ź' => 'z',
        'ż' => 'z',
        // Latvian
        'Ā' => 'A', 'Č' => 'C', 'Ē' => 'E', 'Ģ' => 'G', 'Ī' => 'i', 'Ķ' => 'k', 'Ļ' => 'L', 'Ņ' => 'N',
        'Š' => 'S', 'Ū' => 'u', 'Ž' => 'Z',
        'ā' => 'a', 'č' => 'c', 'ē' => 'e', 'ģ' => 'g', 'ī' => 'i', 'ķ' => 'k', 'ļ' => 'l', 'ņ' => 'n',
        'š' => 's', 'ū' => 'u', 'ž' => 'z'
    );
    $str = preg_replace(array_keys($options['replacements']), $options['replacements'], $str);
    if ($options['transliterate']) {
        $str = str_replace(array_keys($char_map), $char_map, $str);
    }
    $str = preg_replace('/[^\p{L}\p{Nd}]+/u', $options['delimiter'], $str);
    $str = preg_replace('/(' . preg_quote($options['delimiter'], '/') . '){2,}/', '$1', $str);
    $str = mb_substr($str, 0, ($options['limit'] ? $options['limit'] : mb_strlen($str, 'UTF-8')), 'UTF-8');
    $str = trim($str, $options['delimiter']);
    return $options['lowercase'] ? mb_strtolower($str, 'UTF-8') : $str;
}

// Kullanımı
$deger = "Bu Türkçe Bir Yazıdır";
echo permalink($deger);

$deger = "Συχνές Ερωτήσεις";
echo permalink($deger);

Eğer kullanımı ile ilgili daha fazla detay isterseniz yorumlar bölümünden bana sorabilirsiniz.

Yayınlayan

Tayfun Erbilen

2009’dan beri web işleriyle uğraşan, aynı zamanda amatör müziklede ilgilenen sıradan birisi..

“Php Sef Link Fonksiyonu” üzerine 35 yorum

  1. Bu fonksyionda bişey dikkatimi çekti. Değer içinde geçen (-)'yi önce boş karakter ile değiştirmişsin sonra da o boşluğu (-) ile değiştirmişsin. Neden öyle yaptığını anlayamadım. Direkt bul ve yap dizilerinde (-) ile boşluğu yer değiştirsen olmaz mı?

  2. @Murat Gül, olurdu.. Ancak o şekilde düzenleyip fonksiyonu şu değer ile çalıştırdığımızda "Merhaba Hayat – Tayfun Erbilen" bize şöyle bir değer döndürecekti. "merhaba-hayat—tayfun-erbilen".. Dolayısı ile birden fazla – işareti gözükecekti.. Bunun olmaması için bu şekilde kullanılması gerekiyor.

  3. sevgili kardeşim bu fonksiyonu kullanıyorum fakat veri tabanına kayıt yaptırırken tr karekterler "-" tire olarak kaydediyor. bunun nedeni ne olabilir acaba?

  4. @Ali , bende öyle bir sorun yok 🙂 Veritabanı karakter setinin utf8 olmasına dikkat edin.

  5. $baslik = str_replace(array(""","'"), NULL, $baslik);

    bu kod sanırım hiç bir işe yaramıyor bi bakar mısınız?

  6. @Berkay Barutcu, evet yaramıyor.. Ben zamanında kendim tırnakları replace ettiğim için o kod orada duruyor 🙂 Yani o olmadanda kullanabilirsin, sorun yok.

  7. Tayfun yardımcı olabilirsen çok sevinirim abi.
    @[^A-Za-z0-9\-_]@i anlamı nedir? Yazılma mantığı nasıldır bu tarz ifadelerin?
    <[^>]*> Mesela bunun kapsamı nedir?
    Tüm üst karakterleri ve noktalama işaretlerini içeren bu tarz bir ifade yazılması mümkün mü?
    Kolay Gelsin. İyi Çalışmalar.

  8. Selam Fatih, bunlara düzenli ifadeler (regular expression) deniyor. Kısaca regex ya da regexp'de diyebiliriz. Genelde regex kuralları her dil için ayınıdır, sadece yazım tarzları biraz değişik oluyor.. Örneğin;

    [^A-Za-z0-9\-_]

    Burada dediğimiz şey sadece a'dan z'ye büyük – küçük harf ve sayılar geçerli. Ve ek olarak tire ve alt tire karakterleri.. Tirenin başındaki ters slash tire elemanını geçersiz kılmak için kullanılıyor. Çünkü normal şartlarda regex'de tıpkı { gibi [ gibi tire karakteride başka bir işe yarıyor ama bu şekilde kırdığımızda normal bir karakter gibi okuyor.

    Benim daha önce hazırladığım bir video var, tekrar yükleyeceğim prototürk üzerinden takip edebilirsin.
    Nette araştırırsan bu konuyla ilgili bir çok makale'ye de göz atabilirsin, biraz karışık gibi görünsede mantığı anladığında çokda zor olmadığını göreceksin.

  9. Tayfun cevabın için çok teşekkürler, çok işime yaradı. Kolay Gelsin.

  10. Meraba ya ben bu sef linki bir türlü yapamadım bana yardımcı olun lütfen..

    Benim link yapım şöyle
    <a href="kategorialt.php?&kimlik=<?php echo $dizi["Kimlik"] ?>">

    Birçok yerde birçok şey yazmışlar ama hiçbiride kafamı karıştırmaktan başka bir işe yaramadı ..

    1. 100-basarili şeklinde döndürür. Zaten geliştirmesi size kalmış, bu standart olarak kullanılandır. Başka yerde de %100 başarı kelimesi bu şekilde çevrilir. Ama istersen özel karakterleri atıyorum % yerine yuzde yazdırmak gibi replace edebilirsin ben etmemeyi tercih ettim 🙂

  11. Merhaba; .htaccess ile ilgili bir soru sormak istiyorum.
    site.com/index.php?page=uye-detay&id=9637 şeklindeki bir linki, nasıl site.com/uye-detay/uye-kullanici-adi/ şeklinde yapabilirim acaba ? En sondaki “id” yerine kullanici_adi görünsün, önüne de uye- gelsin istiyorum. Bir de htaccess dosyasına kodu yazıktan sonra, php dosyalarındaki linklerde bir değişiklik yapmamız gerekecek mi ? Teşekkürler

    1. Eğer linkte kullanıcı adı istiyorsan get parametrelerine de bu adı alman gerekiyor. Yani asıl link yapın şöyle olacak;
      site.com/index.php?page=uye-detay&kadi=gamze

      ve buna istediğin htacess kodların ise şöyle olacak;

      RewriteEngine On
      RewriteRule ^uye-detay/uye-([0-9a-zA-Z-_]+)(/?)$ index.php?page=uye-detay&kadi=$1

      kolay gelsin.

  12. Site.com/profil.php?kadi=Mehmet&bolum=hakkinda linkini nasıl Site.com/Mehmet/hakkinda olarak çeviririm, şimdiden teşekkürler..

  13. Tayfun kardeşim tam dehşet bir adamsın PHP ‘de çözemediğim tüm sorunlarıma resmen sen kaynak oluyosun ustam.. sana ne kadar teşşekkür etsem azdır .. seviliyosun kardeşim 🙂

  14. Teşekkür Ederim Tayfun Abi, Ellerine Sağlık 🙂 Aynen Kullandım ama Açıklama Satırı da Düştüm 😀 😀 Tayfun Abim’den Alıntı Diye 😀

  15. Hacı amma yemişsin ortamı seflink fonksiyonu diye. Bu sef lilnk fonsiyonu değil bir Stringi alıp onun içindeki boşluk Türkçe karakter gibi parçaları ayıklamaya yarayan bir fonksiyon.
    Yani bu fonksiyon tek başına sadece
    Bak bu Tükçe Bir yazı Yı alıp
    bak-bu-turkce-bir-yazi
    yapar ve bunun da echo dan başka bir işe yaramayacağını ikimizde biliyoruz. sadece tıklanacak ancak gidilemeyecek bir sayfa linki oluşturmuş olursun..
    demem o ki anlattın bari adam gibi htaccess kısmına kadar girseydin.. Bu senin verdiğin için 4/1 bile değil..

  16. @Rızaaaa, adı üstünde fonksiyon yazıyor konu adında. Tabi önce okumak lazım yorum yazmadan önce. İçimdeki %50 sana kızmadan terk et bu bloğu sana göre değil buralar.

  17. bu sef link fonksiyonu değil arkadaşlar php ile alakası yok .htaccese eklenen sef link fonksiyonunun çalışmasını sağlayan link düzenleyicidir.

  18. @Rızaaaa,
    sana tilt oldum, senin gibi bilgisiz cahillerin bu işlerle uğraşmasından bıkkınlık geldi. git kumda oyna sen ve senin gibileri…

    1. Öncelikle veritabanında haber başlığını bu permalink> fonksiyonundan geçirerek ayrı bir sütunda tutacaksın. Örneğin haber_url gibi bir sütunda.

      Daha sonra haber.php?id=15 adresinin yapısını haber.php?url=haber-basligi-yazisi şeklinde değiştireceksin. Kontrollerini php dosyanda haber_url’e göre ayarlayacaksın. Buraya kadar her şeyi yaptıysan. Artık .htaccess dosyana şu kodu yazarsan;

      RewriteEngine On
      RewriteRule ^([0-9a-zA-Z-_/]+)$ haber.php?url=$1 [QSA]

      Yukarıdaki örnek verdiğim link yapısına artık siteadi.com/haber-basligi-yazisi.html olarak ulaşabilirsiniz.

  19. Merhaba tayfun abi benim linkim şu şekilde

    http://localhost/capsology/profil.php?getuserid=sdfg ama ben linkimi
    http://localhost/capsology/sdfg/ şeklinde yapmak istiyorum bunu nasıl yapabilirim ? adam geldi link yerine http://localhost/capsology/sdfg yazdı ama tıklayınca http://localhost/capsology/sdfg/ olacak bunu nasıl yapabilirim ?
    Birde anasayfa.php, destek.php, hesap.phpvar ben linkte sadece anasayfa, destek, hesap olarak gözüksün istiyorum bunu nasıl yapabilirim

    Bu arada fonksiyon için ve cevabın için şimdiden teşekkür ederim 😀

    1. Kardeşim ilk olarak .htaccess dosyanı oluştur ana dizinde. Daha sonra şunları ekle;

      RewriteEngine On
      RewriteRule ^profil/([0-9a-zA-Z-_/]+)$ profile.php?getuserid=$1 [QSA]
      RewriteRule ^anasayfa$ anasayfa.php [QSA]
      RewriteRule ^destek$ destek.php [QSA]
      RewriteRule ^hesap$ hesap.php [QSA]

      Profili mecburen profil/blabla şeklinde yaptık yoksa ayırt etmek için sql işlemi yapman gerekirdi ya da cache mantığıyla yapardın ama başlangıç için seni yorabilir, en güzeli böyle bir yapı kurman olur.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir