我想确保所有这样的标签都对 Twitter 有效,因此我想验证输入的值是否有无效字符。请注意,用户可能来自非英语国家。
我知道通常的限制,例如不能以数字开头的标签和没有特殊标点符号,但我想知道是否有已知的所有其他技术上允许在标签内使用的字符列表(即国际字符)。
现代大多数编程语言实现正则表达式的方式都相似,很多语言都借鉴了Perl的方法。以下两个例子希望能帮助你正确使用正则表达式:
Perl:
使用POSIX括号表达式(例如:[[:alpha:]]
、[[:allnum:]]
、[[:digit:]]
等),与字符类(例如:\w
)相比,它们可以更精确地控制要匹配的字符。
在模式匹配时使用/u
修饰符启用Unicode支持。在此修饰符下,ASCII平台有效地变成了Unicode平台;因此,例如\w
将匹配Unicode中的超过100,000个单词字符之一。
有关更多信息,请参阅Perl文档:
Ruby:
使用POSIX括号表达式,因为它们包含非ASCII字符。例如,/\d/仅匹配ASCII十进制数字(0-9);而/[[:digit:]]/匹配Unicode Nd类别中的任何字符。
有关更多信息,请参见Ruby文档:
例子:
给定一个标签列表,下面的正则表达式将匹配所有以单词字符(包括国际单词字符)开头,后跟至少一个其他单词字符、数字或下划线的标签:
m/^#[[:alpha:]][[:alnum:]_]+$/u # Perl
/^#[[:alpha:]][[:alnum:]_]+$/ # Ruby
Twitter允许使用字母、数字和下划线。
我通过他们的API生成推文进行了检查。例如,发布以下推文:
Hash tag test #foo[bar
结果,"#foo"被标记为一个哈希标签,而"[bar"被视为未格式化的文本。
只是想补充一点,除了字母数字和下划线之外,在 Twitter 标签中似乎还可以使用 em 破折号,例如 #COVIDー19
。
首先,你不能在hashtag中使用 # 符号(##hash)。
以下准则摘自Twitter帮助中心:
人们在Twitter上使用井号符号#,在相关的关键词或短语(无空格)之前,对这些推文进行分类,以帮助它们更容易地在Twitter搜索中显示。我在实现golang时遇到了同样的问题。 看起来允许使用[[:alpha:]]字符仅限于英文字母,并且不能对其他语言字符使用此语法。 相反,我可以使用\p{L}来解决这个问题。
我的\p{L}测试在这里。 * 阿拉伯语、希伯来语、印地语等还没有得到确认。
只允许字母和数字作为标签的一部分。如果在首个#
和字母或数字之后出现其他字符,标签将在此处被截断。
我建议您的用户界面通过改变输入框中的文本颜色来提示用户,如果用户输入的内容不是字母或数字。