2011-12-27 34 views
18

Tôi cần biểu thức chính quy javascript để khớp với tên người dùng twitter.Cụm từ thông dụng cho tên người dùng twitter

Tên người dùng được người dùng nhập trong khi đăng ký, vì vậy tôi không muốn làm họ phân tâm với quá nhiều thông báo lỗi. Do đó, tôi cần biểu thức để khớp với các tên người dùng hợp lệ nếu chúng có @ trước tên người dùng hay không.

Tên người dùng Twitter có thể chứa ký tự latin, dấu gạch dưới và số và giới hạn duy nhất có thể dài tối đa 15 ký tự. (nhưng tôi cần regex để phù hợp với 16 ký tự, trong trường hợp ai đó nhập vào @ trước tên người dùng).

+0

Đây không phải là bản sao của câu hỏi được liên kết, vì giải pháp được chấp nhận sử dụng "nhìn lại tích cực" hoặc somesuch Javascript (Firefox ít nhất) không hỗ trợ. – bevanb

Trả lời

30

này nên làm: ^@?(\w){1,15}$

+0

việc này được thực hiện. – ppp

+4

mặc dù nó sẽ làm việc chỉ cần tìm cho OP, chỉ muốn làm cho một bình luận chung cho những người không biết 'regex'. Thử nghiệm này sẽ chỉ khớp nếu tên người dùng được kiểm tra là bộ ký tự duy nhất có trong dòng văn bản hoặc chuỗi nhất định, tùy thuộc vào phiên bản của công cụ 'regex', đó là lý do tại sao nó được đặt giữa^và $, nhưng thử nghiệm này sẽ thất bại nếu có bất kỳ ký tự nào khác, bao gồm ký tự khoảng trắng, trong cùng một dòng hoặc chuỗi ... chỉ muốn nêu rõ sự thật, vì vậy, ai đó sẽ không cố gắng sử dụng điều này cho một thứ như tìm kiếm toàn văn. :) – techexpert

+0

Vai trò của '? 'Ở đây là gì? – San

0

Để loại trừ "non-latin" ký tự, bạn phải sử dụng: ^@?([a-zA-Z0-9_]){1,15}$. Bởi vì, \w chấp nhận "bất kỳ ký tự từ nào". Và các ký tự không phải tiếng Latinh đủ điều kiện cho điều kiện này. Vì vậy, nó phù hợp với thậm chí üö giống như các ký tự Thổ Nhĩ Kỳ.

+0

không đúng. \ w khớp chính xác [a-zA-Z0-9_] và không có gì khác. – asenovm

+2

Trước khi bình luận một điều gì đó, xin vui lòng ít nhất là kiểm tra nó và chắc chắn rằng đó là sự thật. Xem ở đây: http://jsfiddle.net/wBPEQ/ –

+1

Tôi không thấy điều này chứng minh. Tất cả những gì tôi nói là \ w giống như [a-zA-Z0-9_] và \ w KHÔNG khớp với các chữ cái khác từ những chữ cái trong bảng chữ cái tiếng Anh. – asenovm

24

Đây là giải pháp tốt nhất mà tôi đã tìm thấy để thay thế nhiều lần xuất hiện của tên người dùng twitter.

Regex thực hiện thủ thuật là /(^|[^@\w])@(\w{1,15})\b/. Tôi đang bắt những gì đứng đằng sau các ký tự @ vì vậy tôi có thể thay thế tên người dùng một cách chính xác. Và tôi đang sử dụng cờ kết hợp toàn cầu (g) ​​để nó sẽ thay thế tất cả các lần xuất hiện. asenovm câu trả lời rất đơn giản, nhưng sẽ không hoạt động trong hầu hết ngữ cảnh nhập của người dùng, vì techexpert đang giải thích trong his comment.

var output, 
    text = "@RayFranco is answering to @AnPel, this is a real '@username83' but this is [email protected], and this is a @probablyfaketwitterusername", 
    regex = /(^|[^@\w])@(\w{1,15})\b/g, 
    replace = '$1<a href="http://twitter.com/$2">@$2</a>'; 

output = text.replace(regex, replace); 

console.log (output); 

Đây là đem lại cho tôi những gì tôi mong đợi (thử nghiệm với nút v0.9.1):

@RayFranco được trả lời để @AnPel, đây là một thực tế '@username83' nhưng đây là một @ email .com, và đây là một @probablyfaketwitterusername

này được dựa trên Twitter "specs" for username:

012.351.

Tên người dùng của bạn không thể dài hơn 15 ký tự. Tên thật của bạn có thể dài hơn (20 ký tự), nhưng tên người dùng được giữ ngắn hơn để dễ dàng hơn. Tên người dùng chỉ có thể chứa ký tự chữ và số (chữ cái A-Z, số 0-9) ngoại trừ dấu gạch dưới, như đã lưu ý ở trên. Kiểm tra để đảm bảo tên người dùng mong muốn của bạn không chứa bất kỳ ký hiệu, dấu gạch ngang hoặc dấu cách nào.

Hy vọng điều này sẽ hữu ích.

2

Một ngắn một cách dễ dàng để làm điều đó:

function validTwitteUser(sn) { 
    return /^[a-zA-Z0-9_]{1,15}$/.test(sn); 
} 
0

Nó có thể là nhiều hơn bạn cần nhưng tôi thấy điều này trong bài khác "regex how to replace twitter links". Kết thúc @usernames, #hashtags và url. Làm việc tốt cho tôi.

function processTweetLinks(text) { 
    var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi; 
    text = text.replace(exp, "<a href='$1' target='_blank'>$1</a>"); 
    exp = /(^|\s)#(\w+)/g; 
    text = text.replace(exp, "$1<a href='https://twitter.com/hashtag/$2?src=hash' target='_blank'>#$2</a>"); 
    exp = /(^|\s)@(\w+)/g; 
    text = text.replace(exp, "$1<a href='http://www.twitter.com/$2' target='_blank'>@$2</a>"); 
    return text; 
} 
Các vấn đề liên quan