Route-problem concernant les umlauts encodés en URL (en utilisant le framework Zend)

StackOverflow https://stackoverflow.com/questions/127389

  •  02-07-2019
  •  | 
  •  

Question

Aujourd'hui, je suis tombé sur un problème qui semble être un bogue dans Zend-Framework. Étant donné l'itinéraire suivant:

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

et trois URL:

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

la dernière URL ne correspond pas et donc le bon contrôleur n'est pas appelé. Quelqu'un a un indice pourquoi?

Fyi, où utilise Zend-Framework 1.0 (Ouais, je sais que c’est ancien, mais je ne suis pas responsable de le changer: - /)

Éditer: D'après ce que j'ai entendu, nous allons bientôt passer à Zend 1.5.6, mais je ne sais pas quand, alors un correctif serait génial.

Edit: je l'ai suivi jusqu'à la ligne suivante (Zend / Controller / Router / Route.php: 170):

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

Si je change cela en

  $this->_regexDelimiter . 'i';

ça marche. D'après ce que j'ai compris, le modificateur u est destiné au travail avec des caractères asiatiques. Comme je ne les utilise pas, je suis d'accord avec ce correctif. Merci d'avoir lu.

Était-ce utile?

La solution

Le problème est le suivant:

  

L'utilisation du modificateur de modèle / u empêche   mots d'être mutilé mais à la place   PCRE saute des chaînes de caractères avec   valeurs de code supérieures à 127.   Par conséquent, \ w ne correspondra pas à un   mot multi-octets (non-ascii inférieur) à   tous (mais n'a pas non plus & # 8217; t retourné des portions de   il). A partir de la page de manuel pcrepattern;

     

En mode UTF-8, caractères avec des valeurs   supérieur à 128 ne correspond jamais à \ d, \ s,   ou \ w, et correspond toujours à \ D, \ S et   \ W. Ceci est vrai même quand Unicode   le support des propriétés du personnage est   disponible.

De Gestion d'UTF-8 avec PHP . Par conséquent, si votre URL est codée ISO-8859-1 (mysite.local / citytest / M% FCnchen) ou UTF-8 (mysite.local / citytest / M% C3% BCnchen), l’adresse par défaut ne le sera pas. rencontre.

J'ai également fait des expériences avec des trémas dans les URL dans Zend Framework et je suis parvenu à la conclusion que vous ne voudriez pas vraiment des trémas dans vos URL. Le problème est que vous ne pouvez pas compter sur l'encodage utilisé par le navigateur pour l'URL. Par exemple, Firefox (antérieur à la version 3.0) ne code pas les URL UTF-8 saisies dans la zone de texte de l’adresse (si cela n’est pas spécifié dans about: config) et IE dispose d’une case à cocher dans ses options pour choisir entre le codage normal et UTF-8 pour ses URL. . Mais si vous cliquez sur des liens dans une page, les deux navigateurs utilisent l'URL dans le codage donné (UTF-8 sur une page UTF-8). Par conséquent, vous ne pouvez pas savoir avec certitude dans quel codage les URL sont envoyées à votre application - et détecter le codage utilisé n’est pas si simple à faire.

Il est peut-être préférable d'utiliser des paramètres translittérés dans vos URL (par exemple, remplacez & # 196; par Ae, etc.). Il existe un moyen très simple de le faire (je ne sais pas si cela fonctionne avec toutes les langues mais je l’utilise avec des chaînes allemandes et cela fonctionne assez bien):

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, '-');
}

Autres conseils

S'il vous plaît, cela fonctionne parfaitement pour moi

/^[\p{L}-. ]*$/u
  • ^ Début de la chaîne
  • [ ... ]* Zéro ou plusieurs des éléments suivants:
  • \p{L} Caractères de lettre Unicode
  • tirets
  • . périodes
  • espaces
  • $ Fin de la chaîne
  • /u Activer le mode Unicode en PHP

EXEMPLE:

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

Le modificateur u fait que l'expression rationnelle attend une entrée utf-8. Cela suggère que ZF s'attend à une entrée codée en utf-8, et non à ISO-8859-1 (je ne suis pas trop familier avec ZF, donc je ne fais que deviner ici).

Si tel est le cas, vous devrez utf-8 encoder le ü précédent. en l'utilisant dans une URL. Il deviendrait alors: mysite.local/citytest/M%C3%BCnchen

Notez que puisque le reste de votre application parle probablement ISO-8859-1 (valeur par défaut pour PHP < = 5), vous devrez explicitement décoder la variable avec utf8_decode , avant de pouvoir l'utiliser.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top