如何使用正则表达式验证Twitter用户名

18

我已经在函数中使用了模式/[a-z0-9_]+/i

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

我用这个来测试输入是否是一个有效的Twitter用户名,但是我遇到了一些困难,因为它没有给我一个有效的结果。

有人能帮助我找到解决方案吗?


1
请注意,ereg *函数已在PHP 5.3.0中过时,应改用preg_*函数,例如在此情况下使用preg_match。 - Tatu Ulmanen
向我们展示输入、期望输出和实际输出也会对我们有所帮助。 - npinti
我认为这是 https://dev59.com/ClPTa4cB1Zd3GeqPk59x 的重复。 - Dan
6个回答

37
验证一个字符串是否是有效的Twitter用户名:
function validate_username($username)
{
    return preg_match('/^[A-Za-z0-9_]{1,15}$/', $username);
}

如果你想在一个字符串中匹配@username
例如:RT @username: lorem ipsum @cjoudrey etc... 请使用以下内容:
$string = 'RT @username: lorem ipsum @cjoudrey etc...';
preg_match_all('/@([A-Za-z0-9_]{1,15})/', $string, $usernames);
print_r($usernames);

你可以使用后者与preg_replace_callback一起在字符串中链接化用户名。
编辑:Twitter还为Java和Ruby开源了文本库,用于匹配用户名、哈希标签等等。你可以查看代码,找到他们使用的正则表达式模式。
编辑(2):这是Twitter Text Library的PHP版本:https://github.com/mzsanford/twitter-text-php#readme

4
上述模式也适用于电子邮件地址,例如someone@email.com将返回@email,这显然不是Twitter用户名的意图。我通过添加否定前瞻(?![.A-Za-z])来修复了这个问题。完整字符串:/@([A-Za-z0-9_]{1,15})(?![.A-Za-z])/ - KryptoniteDove
2
[A-Za-z0-9_] 不就是 \w 吗? - Ayyash
1
@KryptoniteDove的评论应该被用作答案,因为它是正确的并且解决了一个烦人的问题。你能更新一下吗?http://regexr.com/38pig - EvilDr

3
不要在ereg*中使用/。 实际上,如果可以避免,根本不要使用ereg*http://php.net/preg_match 编辑:还请注意,/[a-z0-9_]+/i将匹配到spaces are invalidnot-a-real-name。 您几乎肯定需要使用/^[a-z0-9_]+$/i。 S

2

我相信你正在使用PCRE表单,此时你应该使用preg_match函数。


2

eregi() 不需要任何 / 或其他开关,只需使用 eregi('[a-z0-9_]+')


2

2

Twitter用户名称由1到15个字符组成...因此使用/^[a-z0-9_]{1,15}$/i会更好。


1
我认为,Twitter允许用户名最少有3个字符。 - Nik Sumeiko
1
我认为现在已经可以了,但之前用户能够注册更短的用户名(像@a),因此您仍然需要使用至少1个字符来捕获这些用户名。 - cmbuckley
1
谢谢你的回答。你在哪里找到的字符集?我的意思是,你在哪里读到Twitter用户名可以是 [A-Za-z0-9_]{1,15}? - ItalyPaleAle
7
好的,我在Twitter的开源代码中搜索了一下,发现它实际上是 /[a-zA-Z0-9_]{1,20}/ 。来源:https://github.com/twitter/twitter-text-js/blob/24c513652e3ece6853b77575b60206617ce26fd3/twitter-text.js#L215 - ItalyPaleAle
@Qualcuno,我相信那是你真实姓名的限制。无论我看到哪里,用户名的限制都是15个字符。 - nilskp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接