'Oldukça URL'leri' yeniden ne zaman Aksanları (aksan) işlemek nasıl

5 Cevap php

Ben kullanıcı oluşturulan travelblogs başlığını içeren URL'leri yeniden yazmak.

Ben URL'lerin okunabilirlik ve SEO amaçlar için bunu.

 http://www.example.com/gallery/280-Gorges_du_Todra/

İlk tamsayı kalan biz insanlar için, id (ama kaynak talep için önemli değildir).

Now people can write titles containing any UTF-8 character, but most are not allowed in the URL. My audience is generally English speaking, but since they travel, they like to include names like

 Aït Ben Haddou

Linux üzerinde PHP kullanarak bir URL görüntüleme için bu çevirmek için doğru yolu nedir.

Bugüne kadar çeşitli çözümler gördüm:

  1. just strip all non allowed characters, replace spaces this has strange results:
    'Aït Ben Haddou' → /gallery/280-At_Ben_Haddou/
    Not really helpfull.

  2. just strip all non allowed characters, replace spaces, leave charcode (stackoverflow.com) most likely because of the 'regex-hammer' used
    this gives strange results: 'tést tést' → /questions/0000/t233st-t233st

  3. translate to 'nearest equivalent'
    'Aït Ben Haddou' → /gallery/280-Ait_Ben_Haddou/
    But this goes wrong for german; for example 'ü' should be transliterated 'ue'.

For me, as a Dutch person, the 3rd result 'looks' the best.
I'm quite sure however that (1) many people will have a different opinion and (2) it is just plain wrong in the german example.

3. seçeneği ile başka bir sorundur: Bir 7bit eşdeğerine dönüştürülebilir olası tüm karakterleri bulmak için nasıl?

Yani soru şu:

  1. ne, sizce, en çok arzu edilen sonucudur. (Teknoloji sınırları içinde)

  2. Nasıl teknik bunu çözmek için. PHP ile (istenilen sonuca ulaşmak).

5 Cevap

Sonuçta, bu sorun için, "doğru" fikrinden vazgeçmek zorunda gidiyoruz. Dize tercüme olursa olsun, bunu nasıl, uyumluluk ve okunabilirlik adına doğruluk yok. Her üç seçenek eşit uyumlu, ama # 1 ve # 2 okunabilirliği açısından acı. Yani sadece onunla çalıştırmak ve en iyi görünüyor ne olursa olsun gitmek için - seçenek 3..

Evet, çeviriler Alman için yanlış, ama sen (ve tek onları sınırlayan) ne dil kendi başlıkları belirtmek için kullanıcılar gerektiren başlatmak sürece, bu değer çok daha fazla çaba olmadan bu sorunu çözmek için gitmiyoruz. (Örneğin, bilinen her dil için sözlükler arasında başlığında her kelime çalışan ve dili olur work kurallarına göre bu kelimenin Aksanları çeviri, ama aşırı değil.)

äae, {[(3: Alman diğer dillere göre daha yüksek bir endişe Alternatif olarak, eğer, sizin çeviri always Almanca sürümü bir var kullandığınızdan emin olun )]} → e, ïi, öoe, {[(9)] } → ue.

Edit:

Varsa Oh, ve gerçek usulde için, ben str_replace, sonra da iconv kalanı için kullanmak yoluyla, özel durumlarda çevirmek istiyorum:

$text = str_replace(array("ä", "ö", "ü", "ß"), array("ae", "oe", "ue", "ss"), $text);
$text = iconv('UTF-8', 'US-ASCII//TRANSLIT', $text);

Benim için üçüncü en okunabilir.

Sen mesela küçük bir sözlük kullanabilirsiniz ï -> i ve ü -> ue çevrilmesi için çeşitli charcaters istiyorum nasıl belirtmek için.

Ilginç bir yan not olarak SO şey gerçekten ID sonra önemi görünüyor - bu sayfaya bir link:

http://stackoverflow.com/questions/465990/why-does-this-link-go-to-the-same-place

Açıkçası motivasyon bağlantılarını koparmadan başlık değişiklikleri sağlamak için, ve siz de bu özelliği düşünebilirsiniz.

Nice topic, I had the same problem a while ago.
Here's how I fixed it:

function title2url($string=null){
 // return if empty
 if(empty($string)) return false;

 // replace spaces by "-"
 // convert accents to html entities
 $string=htmlentities(utf8_decode(str_replace(' ', '-', $string)));

 // remove the accent from the letter
 $string=preg_replace(array('@&([a-zA-Z]){1,2}(acute|grave|circ|tilde|uml|ring|elig|zlig|slash|cedil|strok|lig){1};@', '@&[euro]{1};@'), array('${1}', 'E'), $string);

 // now, everything but alphanumeric and -_ can be removed
 // aso remove double dashes
 $string=preg_replace(array('@[^a-zA-Z0-9\-_]@', '@[\-]{2,}@'), array('', '-'), html_entity_decode($string));
}

İşte benim işlevi nasıl çalışır:

  1. Bu varlıkları html dönüştürmek
  2. Aksan Strip
  3. Kalan tüm garip karakter kaldır

Şimdi insanlar herhangi bir UTF-8 karakter içeren başlıkları yazabilirsiniz, ama çoğu URL izin verilmez.

Aksine, en fazla izin verilir. http://en.wikipedia.org/wiki/Caf é güzel (aka http://en.wikipedia.org/wiki/Caf%C3%A9) ekran gibi şeyler - - stackoverflow en vurgulayıcı :-) doğru onları almak olmasa bile örneğin Wikipedia'nın URL'leri görmek

Hüner herhangi bir hosting ortamı karşısında güvenilir onları okuyor; CGI ve Windows sunucuları ile ilgili sorunlar, örneğin, özellikle IIS vardır.