2009-04-12 6 views
3

Je prépare une fonction en PHP pour convertir automatiquement une chaîne à utiliser comme nom de fichier dans une URL (* .html). Bien que ASCII devrait être utilisé pour être du bon côté, pour les besoins de SEO je dois autoriser le nom de fichier dans n'importe quelle langue mais je ne veux pas qu'il inclue une ponctuation autre qu'un tiret (-) et un trait de soulignement (_), des caractères comme *% $ # @ " » ne devrait pas être autorisé.regex pour correspondre à n'importe quel caractère UTF à l'exclusion de la ponctuation

les espaces doivent être convertis en tirets.

Je pense que l'utilisation de Regex sera la meilleure façon, mais je ne suis pas sûr qu'il comment gérer chaînes UTF8

Mes fonctions ASCII ressemble à ceci:.

function convertToPath($string) 
{ 
    $string = strtolower(trim($string)); 
    $string = preg_replace('/[^a-z0-9-]/', '-', $string); 
    $string = preg_replace('/-+/', "-", $string); 
    return $string; 
} 

Tha nks,

Roy.

Répondre

4

Je pense que pour les besoins de SEO, vous devriez vous en tenir aux caractères ASCII dans l'URL.

En théorie, beaucoup plus de caractères sont autorisés dans les URL. En pratique, la plupart des systèmes analysent uniquement l'ASCII fiable.

En outre, de nombreux scripts d'analyse automatique de liens tronquent les caractères non-ASCII. Ainsi, autoriser les URL avec des caractères non-ASCII dans vos URL réduit considérablement le changement de votre lien montrant (correctement) dans le contenu généré par l'utilisateur. (si vous voulez un exemple d'un tel script, jetez un oeil au script stackoverflow, il s'étrangle entre parenthèses par exemple)

Vous pouvez également jeter un oeil à: How to handle diacritics (accents) when rewriting ‘pretty URLs’

La solution acceptée il y a à transiterate les caractères non-ASCII:

<?php 
    $text = iconv('UTF-8', 'US-ASCII//TRANSLIT', $text); 
?> 

Hope this helps

+0

Vous avez raison sur celui-ci - laisser des caractères non-ASCII dans une URL causera des problèmes car vous devez suivre l'encodage de l'URL du navigateur du client (ce qui n'est pas très cohérent). Mais s'il vous plaît noter, que iconv-transliteration nécessite les paramètres régionaux corrects à définir (encodage UTF-8) - en utilisant Windows ce –

+0

est un show-stopper. –

4

Si UTF-8 mode est sélectionné, vous pouvez sélectionner tous non Lettre s (selon la catégorie générale Unicode - s'il vous plaît se référer à la documentation PHP Regular Expression Details) en utilisant

/\P{L}+/ 

donc je essayez ce qui suit (non testé):

function convertToPath($string) 
{ 
    $string = mb_strtolower(trim($string), 'UTF-8'); 
    $string = preg_replace('/\P{L}+/', '-', $string); 
    $string = preg_replace('/-+/', "-", $string); 
    return $string; 
} 

Sachez que vous aurez prolems avec strtolower() sur UTF-8 cordes comme ça va vous salir avec des caractères multi-octets - utiliser mb_strtolower() à la place.

+0

cela remplacera aussi des choses comme les accents (qui sont normalement non-espacement) avec un '-'. Donc 'Aït Ben Haddou' deviendra 'Ai-t Ben Haddou'. – Jacco

Questions connexes