语言标签的正则表达式(由 BCP47 定义)
我需要一个由 语言标记 的正则表达式.org/rfc/bcp/bcp47.txt">BCP 47。
我知道完整的 BNF 语法可以在 http://www.rfc-editor.org/rfc/ bcp/bcp47.txt 并且我可以用它来编写我自己的,但希望已经有一个了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
看起来像这样:
这是生成它的代码(用 C# 编写):
我不能保证它的正确性(我可能犯了拼写错误),但它在附录 A 中的示例中运行良好。
根据您的环境,您可能需要删除命名的捕获组
"?<...>"
。Looks like this:
Here is the code to generate it (in C#):
I cannot guarantee its correctness (I may have made typos), but it works fine on the examples in Appendix A.
Depending on your environment, you might need to remove the named capturing groups
"?<...>"
.适用于 PHP 的优化版本。
An optimized version that works in PHP.
Javascript 会控制重复的命名捕获组,因此您必须将
?
的第二次使用更改为?
。编译为:这是构建它的方法:
编辑:事实证明 ff 不支持命名捕获组,因此您必须使用
.replace(/\?/g, '')
或者开玩笑,首先将它们排除在外:使用
languageTag.test('en-us')
进行测试Javascript polices duplicate named capture groups so you have to change the 2nd use of
?<privateUse>
to e.g.?<privateUse1>
. Compiles to:Here's a way to construct it:
Edit: turns out ff doens't support named capture groups so you have to strip them out with
.replace(/\?<a-zA-Z>/g, '')
or jest leave them out in the first place:Test with
languageTag.test('en-us')
如果使用基于 CLDR 的函数集,例如 PHP 的
intl
< /a> 扩展名,您可以使用以下函数检查intl
数据库中是否存在语言环境:加载和搜索数据大约需要半毫秒,因此不会太多性能上的成功。
当然,它只会在与所使用的 PHP 版本一起提供的 CLDR 版本的数据库中查找那些内容,但会随着每个后续 PHP 版本进行更新。
If using a CLDR-based function set, like PHP's
intl
extension, you can check if a locale exists in theintl
database using a function like:It takes about half a millisecond to load and search the data, so it won't be too much of a performance hit.
Of course, it will only find those in the database of the CLDR version supplied with the PHP version used, but will be updated with each subsequent PHP release.