为了满足基本变体:
^[A-Za-z]{2,4}([_-][A-Za-z]{4})?([_-]([A-Za-z]{2}|[0-9]{3}))?$
其中包括:
- 语言代码:2 或 3 或 4 供将来使用,alpha。
- 可选脚本代码:ISO 15924 http://unicode.org/iso15924/iso15924-codes.html4阿尔法。
- 可选国家代码:ISO 3166-1 https://en.wikipedia.org/wiki/ISO_3166-12 个字母或 3 个数字。
- 用下划线或破折号分隔。
有效的例子有:
- de
- en-US
- zh-汉特-TW
- En-au
- aZ_cYrl-aZ。
对于OP的具体问题,这需要以前缀/^MyResource[.]
并后缀为$/
确保整个文件名是以语言环境结尾的有效资源文件。
请注意,某些编程语言的函数可能只接受特定形式,例如仅接受下划线和大写国家/地区代码。 PHP 的intl
函数接受大小写和分隔符。 PayPal 仅接受该语言,或la_CY
形式,其中la
是语言并且CY
是国家/地区。 PHPlocale_canonicalize
函数可用于标准化此格式。
IETF RFC 5646 https://www.rfc-editor.org/rfc/rfc5646#page-5,它管理这些标签的互联网使用,建议使用大写和分隔格式,例如az-Cyrl-AZ
,如上面前三个示例中所使用的,尽管它表示处理器应该接受大小写和任一分隔符的任意混合,如最后两个示例所示。显示语言环境时,使用-
因为分隔符允许更细粒度的换行,否则可能会产生明显的空行,就像非换行时一样_
使用,尤其是在表格单元格中。
推荐的基本格式的正则表达式是:
^[a-z]{2,4}(-[A-Z][a-z]{3})?(-([A-Z]{2}|[0-9]{3}))?$
正则表达式仅涵盖基本格式。附加功能有多种变体,例如本地区域。RFC 5646 https://www.rfc-editor.org/rfc/rfc5646#page-5允许此类变体以及私有扩展和向后兼容形式。这完全取决于所需的粒度。这CLDR http://cldr.unicode.org/PHP 使用的 Unicode 数据库intl
函数和其他程序,可能在不同版本中包含此类变体,尽管它们也可能在以后消失。
如果使用基于 CLDR 的函数集,例如 PHP 的intl http://php.net/manual/en/book.intl.php扩展名,您可以检查语言环境中是否存在intl
数据库使用如下函数:
<?php
function is_locale($locale=''){
// STANDARDISE INPUT
$locale=locale_canonicalize($locale);
// LOAD ARRAY WITH LOCALES
$locales=resourcebundle_locales('');
// RETURN WHETHER FOUND
return (array_search($locale,$locales)!==F);
}
?>
加载和搜索数据大约需要半毫秒,因此不会对性能造成太大影响。
当然,它只会在与所使用的 PHP 版本一起提供的 CLDR 版本的数据库中查找那些内容,但会随着每个后续 PHP 版本进行更新。
请注意,某些区域设置不适用于国家/地区,而是区域,并且这些区域设置通常是数字,例如001
对于“世界”,150
对于“欧洲”和419
为“拉丁美洲”。所以现在有en-001
, en-150
, ar-001
, and es-419
,可用于通用语言目的。例如,en-001
旨在解耦依赖en-us
作为一种代用英语,特别是因为它的日期格式和拼写与其他 100 个地区的英语完全不同en
变体。这en-150
区域设置与en-001
编号分隔符和其他欧洲特定格式除外。
一般来说,正则表达式是一种很好的前端健全性检查,可以过滤掉非法字符,特别是为将来可能添加的格式保留格式。它还有助于防止将恶意字符组合发送到查找工具,特别是在使用基于文本的查找命令机制(例如 SQL 或 Xpath)时。