2010-01-20 15 views
21

En mi sitio PHP, actualmente los usuarios inician sesión con una dirección de correo electrónico y una contraseña. También me gustaría agregar un nombre de usuario, este nombre de usuario que configuran será único y no pueden cambiarlo. Me pregunto cómo puedo hacer que este nombre no tenga espacios y trabaje en una URL para poder usar su nombre de usuario para vincularme a sus perfiles y otras cosas. Si hay un espacio en el nombre de usuario, entonces debería agregar un guión bajo jason_davis. No estoy seguro de la mejor manera de hacer esto?URL amigable nombre de usuario en PHP?

+2

Hay muchas preguntas como esta. ¿No obtuviste una respuesta con la búsqueda? – Gumbo

+0

@Gumbo Busqué SO, no google. Posiblemente no es el término correcto, pero sí busqué "nombre de usuario amigable con URL" sin mucha suerte. No sabía que se llamaba babosa antes de esto. – JasonDavis

+1

Quizás no todos intenten convertir nombres de usuario. Pero la búsqueda de "cadena amigable con URL" devuelve resultados utilizables. – Gumbo

Respuesta

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

¡Esto es peligroso! Varios nombres de usuario únicos pueden asignarse a la misma URL. Eso no es lo que quieres, ¿verdad? Considere, por ejemplo, 'AB' y' ab', que son cadenas únicas pero que se asignan a la misma cadena de slug. Debe almacenar el slug como el identificador. –

+2

¡Bonito, Älix! –

+10

@John Feminella: Obviamente tendría que buscar duplicados en algún momento antes de almacenar la babosa. –

3

En otras palabras ... debe crear un nombre de usuario slug. Doctrine (ORM para PHP) tiene una buena función para hacerlo. Doctrine_Inflector::urlize()

EDIT: También debe mantener el nombre de usuario slug en la base de datos, como columna de clave única. Entonces, cada operación de búsqueda debe hacerse en función de esa columna, no el nombre de usuario original.