(Zend-framework kullanarak) Route-sorunu ile ilgili URL-kodlanmış Sesli harfler

3 Cevap php

Bugün Zend-Framework bir hata gibi görünüyor Bir Problem hakkında tökezledi. Aşağıdaki rota göz önüne alındığında:

<test>
    <route>citytest/:city</route>
    <defaults>
    	<controller>result</controller>
    	<action>test</action>
    </defaults>
    <reqs>
    	<city>.+</city>
    </reqs>
</test>

ve üç Url'ler:

  • mysite.local / citytest / Berlin
  • mysite.local / citytest / Hamburg
  • mysite.local / citytest / M% FCnchen

son Url eşleşmiyor ve böylece doğru denetleyicisi denir. Herkes neden bir ipucu var mı?

Bilginize, Zend-Framework 1.0 kullanarak nerede (Evet, ben o eski olduğunu biliyorum ama ben bu :-/ değiştirmek için sorumlu değilim)

Düzenleme: Duyduğuma göre, yakında Zend 1.5.6 yükseltmek için gidiyoruz, ama ne zaman bilmiyorum, bu yüzden bir yama harika olurdu.

Düzenleme: Ben aşağıdaki satırı (: 170 Zend / Controller / Router / Route.php) aşağı takip ettik:

$regex = $this->_regexDelimiter . '^' . 
  $part['regex'] . '$' . 
  $this->_regexDelimiter . 'iu';

Ben bu değiştirirseniz

  $this->_regexDelimiter . 'i';

çalışır. Kimden ne anlıyorum, u-değiştirici Asya karakterleri ile çalışan içindir. Ben onları kullanmak yok gibi, ben bilmek için bu yama ile iyiyim. Okuduğunuz için teşekkürler.

3 Cevap

Problem şudur:

Using the /u pattern modifier prevents words from being mangled but instead PCRE skips strings of characters with code values greater than 127. Therefore, \w will not match a multibyte (non-lower ascii) word at all (but also won’t return portions of it). From the pcrepattern man page;

In UTF-8 mode, characters with values greater than 128 never match \d, \s, or \w, and always match \D, \S, and \W. This is true even when Unicode character property support is available.

From Handling UTF-8 with PHP. Therefore it's actually irrelevant if your URL is ISO-8859-1 encoded (mysite.local/citytest/M%FCnchen) or UTF-8 encoded (mysite.local/citytest/M%C3%BCnchen), the default regex won't match.

Ben de Zend Framework URL'leri umlauts ile deneyler yapılmış ve gerçekten URL'lerinizdeki inceltmeleri istemem sonuca geldi. Sorun URL için tarayıcı tarafından kullanılan kodlama güvenemezsiniz olmasıdır. Firefox (önceki 3,0) Örneğin UTF-8 kodlamak URL'ler adres metin girmiş değil (yaklaşık belirtilen değilse: config) ve IE onun URL'ler için düzenli ve UTF-8 kodlama arasındaki seçim seçeneklerin içinde bir onay kutusu var . Ama sen bir sayfa içinde linklere tıklarsanız hem tarayıcılar verilen kodlama (UTF-8 UTF-8 sayfada) URL'yi kullanın. Ve kullanılan kodlama tespit yapmak için bu önemsiz değildir - bu nedenle URL'ler uygulamasına gönderilir kodlayan hangi emin olamaz.

Belki de URL'lerinizdeki dönüştürülümünden parametreleri (örneğin, değişim Ae için Ä ve benzeri) kullanmak daha iyidir. (Bu her dil ile çalışır ancak Alman dizeleri ile kullanıyorum ve oldukça iyi çalışıyor, ben bilmiyorum) bu gerçekten çok basit bir yolu vardır:

function createUrlFriendlyName($name) // $name must be an UTF-8 encoded string
{
    $name=mb_convert_encoding(trim($name), 'HTML-ENTITIES', 'UTF-8');
    $name=preg_replace(
    	array('/&szlig;/', '/&(..)lig;/', '/&([aouAOU])uml;/', '/&(.)[^;]*;/', '/\W/'),
    	array('ss', '$1', '$1e', '$1', '-'),
    	$name);
    $name=preg_replace('/-{2,}/', '-', $name);
    return trim($name, '-');
}

Benim için çalışmak mükemmeldi memnun

/^[\p{L}-. ]*$/u
  • Dizenin ^ Başlat
  • [ ... ]* aşağıdaki Sıfır veya daha fazla:
  • \p{L} Unicode harf karakterleri
  • tire
  • . süreleri
  • uzaylar
  • Dizenin $ End
  • /u PHP Unicode modunu etkinleştirin

ÖRNEK:

$str= ‘Füße’;
if (!preg_match(“/^[\p{L}-. ]*$/u”, $str))
{
    echo ‘error’;
}
else
{
    echo “success”;
}

U değiştirici sıradanifade utf-8 girişini bekliyoruz yapar. Bu ZF utf-8 kodlanmış giriş beklediğini öneririm, ve olmaz ISO-8859-1 (I ZF ile çok aşina değilim, ben sadece burada tahmin ediyorum).

Bu durumda, bir URL kullanmadan önce utf-8 encode ü gerekecek. Daha sonra olacak: mysite.local/citytest/M%C3%BCnchen

Başvurunuzun geri kalanı muhtemelen ISO-8859-1 konuşuyor beri unutmayın (PHP için varsayılan <= 5), bunu kullanmadan önce açıkça, utf8_decode ile değişken şifresini çözmek zorunda kalacaklar.