在开发包含 twitter 客户端的 iOS 应用程序时,我必须允许用户生成主题标签(可以在应用程序的其他地方创建,而不仅仅是在推文正文中)。
我想确保任何此类主题标签对 twitter 有效,因此我想对输入的值进行错误检查以查找无效字符。请记住,用户可能来自非英语国家。
我知道通常的限制,例如不以数字开头的主题标签,也没有特殊的标点符号,但我想知道是否有一个已知的列表,列出技术上允许在主题标签中的所有其他字符(即国际字符)。
Karl,正如您正确指出的那样,任何语言中的任何单词都可以是有效的 twitter 标签(只要它符合许多基本标准)。因此,您要求的是有效国际单词字符的列表。我确信有人在某处编制了这样的列表,但使用它并不是实现您最初目标的最有效方法:确保给定的主题标签对 twitter 有效。
我相信,您正在寻找的是一个可以匹配Unicode 范围内所有单词字符的正则表达式。这样的表达式将不依赖于您的语言环境,并且会匹配现代排版中可以作为单词一部分出现的所有字符。
您没有指定您正在使用哪种语言编写应用程序,因此我无法帮助您实现特定于语言的实现。但是,基本方法如下:
检查是否有任何括号表达式或字符类已经支持您的语言中的Unicode 字符范围。如果是,那么使用它们。
检查是否存在可以为您的语言启用Unicode 字符范围支持的正则表达式修饰符。
大多数现代语言以非常相似的方式实现正则表达式,其中很多都大量借鉴了 Perl,所以我希望下面的两个例子能让你走上正轨:
珀尔:
使用 POSIX 括号表达式(例如:、、、[[:alpha:]]
等[[:allnum:]]
)[[:digit:]]
,因为与字符类(例如:)相比,它们可以让您更好地控制要匹配的字符\w
。
/u
模式匹配时使用修饰符启用 Unicode 支持。在这个修饰符下,ASCII 平台实际上变成了 Unicode 平台;因此,例如,\w
将匹配 Unicode 中超过 100,000 个单词字符中的任何一个。
有关详细信息,请参阅 Perl 文档:
红宝石:
使用 POSIX 括号表达式,因为它们包含非 ASCII 字符。例如,/\d/ 仅匹配 ASCII 十进制数字 (0-9);而 /[[:digit:]]/ 匹配 Unicode Nd 类别中的任何字符。
有关更多信息,请参阅 Ruby 文档:
例子:
给定一个标签列表,以下正则表达式将匹配所有以单词字符(包括国际单词字符)开头的标签,后跟至少一个其他单词字符、数字或下划线:
m/^#[[:alpha:]][[:alnum:]_]+$/u # Perl
/^#[[:alpha:]][[:alnum:]_]+$/ # Ruby
Twitter 允许使用字母、数字和下划线。
我通过他们的 API 生成推文来检查这一点。例如,发推文
哈希标签测试#foo[bar
导致“#foo”被标记为哈希标签,“[bar”被标记为未格式化的文本。
只想补充一点,除了字母数字字符和下划线之外,您显然可以在 Twitter 主题标签中使用 em dash,例如#COVIDー19
.
好吧,对于初学者来说,您不能在主题标签 (##hash) 中使用 #。
以下指南引用自Twitter 的帮助中心:
- 人们在推文中的相关关键字或短语(无空格)之前使用井号符号 # 来对这些推文进行分类,并帮助它们更容易地在 Twitter 搜索中显示。
- 单击任何消息中带有井号标签的单词会显示所有其他标有该关键字的推文。
- 标签可以出现在推文中的任何位置——开头、中间或结尾。
- 变得非常流行的带有标签的词通常是热门话题。
示例:在下面的推文中,@eddie 包含了#FF 标签。用户将此创建为“关注星期五”的简写,这是一种每周传统,用户推荐其他人应该在 Twitter 上关注的人。你会在星期五看到这个。正确使用主题标签:
- 如果您在公共帐户上使用主题标签发布推文,则搜索该主题标签的任何人都可以找到您的推文
- 不要#spam #with #hashtags。不要过度标记单个推文。(最佳做法建议每条推文使用不超过 2 个主题标签。)
- 仅在与主题相关的推文上使用主题标签。
我有同样的问题要在 golang 中实现。似乎允许带有 [[:alpha:]] 的字符只是英文字母,并且不能将此语法用于其他语言字符。相反,我可以为此目的使用 \p{L} 。
我对 \p{L} 的测试在这里。* 阿拉伯语、希伯来语、印地语...等尚未确认。
只允许字母和数字成为主题标签的一部分。如果除这些字符之外的字符跟在#
开头和字母或数字之后,此时主题标签将被切断。
如果用户输入的不是字母或数字,我建议您的用户界面通过更改输入字段的文本颜色来向用户表明这一点。