2010-01-20 13 views
21

Sur mon site PHP, les utilisateurs se connectent actuellement avec une adresse e-mail et un mot de passe. Je voudrais aussi ajouter un nom d'utilisateur, ce nom d'utilisateur, ils seront uniques et ils ne peuvent pas le changer. Je me demande comment je peux faire en sorte que ce nom ne comporte aucun espace et fonctionne dans une URL pour que je puisse y utiliser un nom d'utilisateur pour créer un lien vers des profils et d'autres choses. S'il y a un espace dans son nom d'utilisateur alors il devrait ajouter un underscore jason_davis. Je ne suis pas sûr de la meilleure façon de le faire?URL Nom d'utilisateur convivial en PHP?

+2

Il y a beaucoup de questions comme celle-ci. N'avez-vous pas obtenu une réponse à la recherche? – Gumbo

+0

@Gumbo J'ai cherché SO, pas google. Peut-être pas le terme correct, mais j'ai fait une recherche pour "URL friendly username" avec pas beaucoup de chance. Je ne savais pas que ça s'appelait une limace avant ça. – JasonDavis

+1

Peut-être que tout le monde n'essaie pas de convertir les noms d'utilisateur. Mais la recherche de "URL friendly string" renvoie des résultats utilisables. – Gumbo

Répondre

88
function Slug($string) 
{ 
    return strtolower(trim(preg_replace('~[^0-9a-z]+~i', '-', html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8')), ENT_QUOTES, 'UTF-8')), '-')); 
} 

$user = 'Alix Axel'; 
echo Slug($user); // alix-axel 

$user = 'Álix Ãxel'; 
echo Slug($user); // alix-axel 

$user = 'Álix----_Ãxel!?!?'; 
echo Slug($user); // alix-axel 
+9

Ceci est dangereux! Plusieurs noms d'utilisateur uniques peuvent correspondre à la même URL. Ce n'est pas ce que tu veux, n'est-ce pas? Considérons, par exemple, AB et ab, qui sont des chaînes uniques mais mappent sur la même chaîne de slug. Vous devriez stocker le slug comme identifiant. –

+2

Un gentil, Älix! –

+10

@ John Feminella: Il devrait évidemment vérifier les doublons à un moment donné avant de stocker la limace. –

3

En d'autres termes ... vous devez créer un slug de nom d'utilisateur. Doctrine (ORM pour PHP) a une belle fonction pour le faire. Doctrine_Inflector::urlize()

EDIT: Vous devez également conserver le nom d'utilisateur slug dans la base de données, en tant que colonne de clé unique. Ensuite, chaque opération de recherche doit être effectuée sur la base de cette colonne et non sur le nom d'utilisateur original.