如何为mb _ *()函数验证用户提供的字符串字符串?

时间:2015-10-15 15:18:16

标签: php validation encoding character-encoding

变量(下面的$my_charset)包含用户提供的字符集/编码字符串,预期为UTF-8ISO-8859-1Windows-1251。我如何以编程方式验证它?我也有处理用户提供的文本(下面是$my_text),据说这种编码。

到目前为止我的解决方案:

$is_valid = @mb_check_encoding($my_text, $my_charset);

我不喜欢它,因为:

  • 它使用错误控制操作符@来抑制错误(例如警告:mb_check_encoding():无效编码“some-invalid-encoding”),这是错误的编程习惯。
  • false返回的值无法帮助我区分错误的charset字符串与有效的charset字符串和错误编码的文本。

PHP提供mb_list_encodings()mb_encoding_aliases()函数,我可以使用这些函数构建所有支持的编码列表,如果用户提供的编码包含在此列表中,则以不区分大小写的方式检查。我不喜欢这个解决方案,矫枉过正。需要为mb_encoding_aliases()(超过50)返回的每件商品致电mb_list_encodings()

你有更好的解决方案吗?

1 个答案:

答案 0 :(得分:2)

您可以使用以下方式自行验证提供的字符集:

$is_valid = @mb_check_encoding('', $my_charset);

错误控制操作符可能很蹩脚,但在此处使用它并没有错。它存在的原因超越了邪恶。而且,您不必担心将不受支持的编码与错误编码的文本混淆。

如果您仍想避免这种情况,使用mb_list_encodingsmb_encoding_aliases并不过分 - 大约有50个编码,每个约有4个别名。虽然如果你不想在每个请求上运行它们,你可以使用它们来生成静态数组并加载它。

实施例

$encodings = mb_list_encodings();
foreach ($encodings as $enc) {
    $encodings = array_merge($encodings, mb_encoding_aliases($enc));
}
$encodings = array_change_key_case(array_fill_keys($encodings, true));
var_export($encodings);

这会转出有效的PHP,您可以将其直接粘贴到php文件中。您可以使用serializejson_encode对其进行序列化,并在以后对其进行反序列化,无论您进入的是什么。

它使用编码作为键而不是值,因此您的查找将在O(1)时间而不是O(n)中进行。 array_change_key_case可以将它们全部小写以便于查找:

$is_valid = isset($encodings[strtolower($my_charset)]);