Kategoriler

Php Sef Link Fonksiyonu

27 yorum

Hazırlamış olduğum php sef link fonksiyonu.

/**
* @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);

Yorumlar (27)

Emre Musaoğlu demiş ki;

Reis bu self link bi harika :D

ahmet demiş ki;

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.

Adem demiş ki;

Sağol abi çok işime yaradı.

Tayfun Erbilen demiş ki;

@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.

Rızaaaa demiş ki;

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..

Zahid Efe demiş ki;

Teşekkür Ederim Tayfun Abi, Ellerine Sağlık :) Aynen Kullandım ama Açıklama Satırı da Düştüm :D :D Tayfun Abim'den Alıntı Diye :D

Tayfun Erbilen demiş ki;

Teşekkür ederim :)

can avcı demiş ki;

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 :)

Tayfun Erbilen demiş ki;

.htaccess'in şöyle olacak;

RewriteEngine On
RewriteRule ^([0-9a-zA-Z-_]+)/([0-9a-zA-Z-_]+)(/?)$ profil.php?kadi=$1&bolum=$2

Mehmet Eren demiş ki;

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

Tayfun Erbilen demiş ki;

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.

Gamze demiş ki;

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

Tayfun Erbilen demiş ki;

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 :)

şevket karayılan demiş ki;

Merhaba
Eksik olmuş gibi geldi. mesela içinde "%100 başarı" geçen bir linki çevirme konusunda %100 başarılımı?

Tayfun Erbilen demiş ki;

Merhaba Aysun,
Bu fonksiyon sadece link yapısını uygun hale getiriyor.. Latin ve diğer özel karakterleri kaldırıp düzgün bir formatta sana yazıyı döndürüyor.. Sen ise sef link yapımını htaccess kullanarak yapacaksın. Bu konuyla ilgili şöyle bir dersim var, izlersen faydalı olacaktır;
http://www.erbilen.net/376-php-ile-sinirsiz-parametre-gondermek-sef-linke-uygun.
html

Aysun demiş ki;

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ı ..

Fatih Gündüz demiş ki;

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

Tayfun Erbilen demiş ki;

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.

Fatih Gündüz demiş ki;

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.

Tayfun Erbilen demiş ki;

@etere, genel bir fonksiyon olduğu için sorun değil :)

etere demiş ki;

http://www.muratkesgin.net.tr/php-sef-link-fonksiyonu-olusturmak.html burada kaynak belirtmeden kodları paylaşmış belirtmek istedim.

Tayfun Erbilen demiş ki;

@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.

Berkay Barutcu demiş ki;

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

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

Tayfun Erbilen demiş ki;

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

Ali demiş ki;

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?

Tayfun Erbilen demiş ki;

@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.

Murat Gül demiş ki;

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ı?

Yorum Gönder