2010-01-20 35 views
21

Trên trang web PHP của tôi, hiện tại người dùng đăng nhập bằng địa chỉ email và mật khẩu. Tôi cũng muốn thêm tên người dùng, tên người dùng này g \ set sẽ là duy nhất và họ không thể thay đổi tên người dùng đó. Tôi tự hỏi làm thế nào tôi có thể làm cho tên này không có không gian trong nó và làm việc trong một URL để tôi có thể sử dụng tên người dùng để liên kết đến hồ sơ có và các công cụ khác. Nếu có một không gian trong đó tên người dùng thì nó sẽ thêm một jason_davis gạch dưới. Tôi không chắc chắn cách tốt nhất để làm điều này?URL Tên người dùng thân thiện trong PHP?

+2

Có rất nhiều câu hỏi như thế này. Bạn không nhận được câu trả lời khi tìm kiếm? – Gumbo

+0

@Gumbo Tôi đã tìm kiếm SO, chứ không phải google. Có thể không phải là cụm từ chính xác nhưng tôi đã tìm kiếm "URL tên người dùng thân thiện" không có nhiều may mắn. Tôi không biết nó được gọi là sên trước đây. – JasonDavis

+1

Có thể không phải ai cũng đang cố gắng chuyển đổi tên người dùng. Nhưng việc tìm kiếm “Chuỗi thân thiện với URL” sẽ trả lại kết quả có thể sử dụng được. – Gumbo

Trả lời

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

Điều này rất nguy hiểm! Nhiều tên người dùng duy nhất có thể ánh xạ tới cùng một URL. Đó không phải là những gì bạn muốn, phải không? Hãy xem xét, ví dụ: 'AB' và' ab', là các chuỗi duy nhất nhưng ánh xạ tới cùng một chuỗi sên. Bạn nên lưu trữ sên làm định danh. –

+2

Đẹp nhất, Älix! –

+10

@ John Feminella: Ông rõ ràng sẽ phải kiểm tra các bản sao tại một số thời điểm trước khi lưu trữ sên. –

3

Nói cách khác ... bạn cần phải tạo tên người dùng. Doctrine (ORM cho PHP) có một hàm tốt để làm điều đó. Doctrine_Inflector::urlize()

EDIT: Bạn cũng nên giữ tên người dùng sên trong cơ sở dữ liệu, dưới dạng cột Khóa duy nhất. Sau đó, mọi hoạt động tìm kiếm phải được thực hiện dựa trên cột đó, không phải tên người dùng ban đầu.

Các vấn đề liên quan