2010-12-12 28 views
19

Tôi đã sử dụng mô hình /[a-z0-9_]+/i bên trong hàm:Làm thế nào để xác nhận một tên người dùng Twitter sử dụng Regex

function validate_twitter($username) { 
if (eregi('/[a-z0-9_]+/i', $username)) { 
    return true; 
} 
} 

Với điều này, tôi thử nghiệm nếu đầu vào là một tên người dùng twitter hợp lệ, nhưng tôi đang gặp khó khăn vì nó không cho tôi kết quả hợp lệ.

Ai đó có thể giúp tôi tìm giải pháp.

+1

Lưu ý rằng các chức năng ereg * đã không còn được sử dụng như PHP 5.3.0, thay vào đó hãy sử dụng hàm preg_ *, preg_match trong trường hợp này. –

+0

Hiển thị cho chúng tôi đầu vào, đầu ra dự kiến ​​và đầu ra thực tế cũng sẽ giúp ích cho chúng tôi ... – npinti

+0

Tôi tin rằng đây là bản sao của http://stackoverflow.com/questions/4766158/php-to-replace-username-with -link-to-twitter-account – Dan

Trả lời

36

Để xác nhận nếu một chuỗi là một Twitter xử lý hợp lệ:

function validate_username($username) 
{ 
    return preg_match('/^[A-Za-z0-9_]{1,15}$/', $username); 
} 

Nếu bạn đang cố gắng để phù hợp với @username trong một chuỗi.

Ví dụ: RT @username: lorem ipsum @cjoudrey etc...

Sử dụng như sau:

$string = 'RT @username: lorem ipsum @cjoudrey etc...'; 
preg_match_all('/@([A-Za-z0-9_]{1,15})/', $string, $usernames); 
print_r($usernames); 

Bạn có thể sử dụng sau này với preg_replace_callback để linkify tên người dùng trong một chuỗi.

Chỉnh sửa: Twitter cũng open sourced text libraries cho Java và Ruby để khớp tên người dùng, thẻ băm, v.v. Có thể bạn có thể xem mã và tìm các mẫu regex mà họ sử dụng.

Chỉnh sửa (2): Đây là một cổng PHP của các văn bản Thư viện Twitter: https://github.com/mzsanford/twitter-text-php#readme

+3

Mẫu trên cũng sẽ khớp với các địa chỉ email, ví dụ [email protected] sẽ trả lại @email rõ ràng không phải là tên người dùng Twitter. Tôi đã sửa lỗi này bằng cách thêm vào một cái nhìn tiêu cực (?! [. A-Za-z]) Chuỗi đầy đủ: /@([A-Za-z0-9_]{1,15})(?![.A- Za-z])/ – KryptoniteDove

+2

Không phải [A-Za-z0-9_] giống như chú thích \ w – Ayyash

+1

@ KryptoniteDove nên được sử dụng làm câu trả lời ở đây vì nó đúng và vượt qua được một vấn đề khó chịu. Bạn có thể cập nhật không? http://regexr.com/38pig – EvilDr

2

Tôi tin rằng bạn đang sử dụng biểu mẫu PCRE, trong trường hợp đó, bạn nên sử dụng hàm preg_match thay thế.

3

Không sử dụng / với ereg*.

Thực tế, không sử dụng ereg* nếu bạn có thể tránh nó. http://php.net/preg_match

chỉnh sửa: Cũng lưu ý rằng /[a-z0-9_]+/i sẽ phù hợp trên spaces are invalidnot-a-real-name. Bạn gần như chắc chắn muốn /^[a-z0-9_]+$/i.

S

2

eregi() sẽ không mong đợi bất kỳ / hoặc bổ sung Toggles. Chỉ cần sử dụng eregi('[a-z0-9_]+')

2

Cụm từ thông dụng của bạn hợp lệ, mặc dù nó cho phép khoảng trắng FYI. (Nếu bạn muốn thử nghiệm các biểu thức chính quy, tôi khuyên bạn nên: http://rubular.com/).

Vấn đề đầu tiên ở đây là việc bạn sử dụng số eregi không được dùng nữa kể từ PHP 5.3. Chúng tôi khuyên bạn nên sử dụng preg_match thay vào đó, nó có cùng cú pháp. Hãy thử và xem nó có giúp ích gì không.

PHP Tài liệu cho preg_match: http://www.php.net/manual/en/function.preg-match.php PHP Tài liệu cho eregi: http://php.net/manual/en/function.eregi.php

2

tên Twitter người dùng có 1-15 ký tự ... vì vậy đây có thể còn tốt hơn với /^[a-z0-9_]{1,15}$/i.

+1

Tôi nghĩ, Twitter cho phép tối thiểu 3 ký tự trong tên người dùng của họ. –

+1

Tôi nghĩ rằng nó hiện nay, nhưng trước đây người dùng có thể đăng ký tên người dùng ngắn hơn (như [@a] (https://twitter.com/a)), vì vậy bạn vẫn cần phải sử dụng tối thiểu 1 ký tự để bắt những cái này. – cmbuckley

+1

Cảm ơn bạn đã trả lời. Bạn đã tìm thấy bộ ký tự ở đâu? Ý tôi là, bạn đã đọc tên người dùng Twitter nào có thể là [A-Za-z0-9 _] {1,15}? – Qualcuno

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