为什么ctype_alnum在匹配文化不可知的字母数字时毫无帮助


Why is ctype_alnum unhelpful in matching culture-agnostic alphanumerics?

让我们假设我在一个名为$text的变量中有一个文本,我想验证它,这样它就可以包含空格、下划线、点以及任何语言的任何字母和任何数字。由于我完全不懂正则表达式,我想我可以学习它,比如:

if (!ctype_alnum(str_replace(".", "", str_replace(" ", "", str_replace("_", "", $text))))) {
    //invalid
}

这正确地认为以下输入有效:

  • foobarloremipsum
  • foobarloremipsu1m
  • foobarloremi psu1m
  • foobar_remi-psu1m

到目前为止,一切都很好。但如果我输入我的名字LajosÁrpád,其中包含非英文字母,那么它将被视为无效。

如果文本中的每个字符都是字母或数字,则返回TRUE,否则为FALSE。

来源。

我认为需要更改设置以允许使用非英文字母,但如果且仅当$text以文化不可知的方式仅包含字母或数字,我如何使用ctype_alnum返回true?

或者,我知道可以使用一些怪异的正则表达式来解决这个问题,包括像'p{L}这样的东西,这很好,但我很想知道使用ctype_alnum是否可行。

您需要在category设置为LC_CTYPE的情况下使用setlocale,并为ctype_*函数族使用适当的语言环境来处理非英语字符。

请注意,与setlocale一起使用的locale需要实际安装在系统上,否则它将无法工作。解决这种情况的最好方法是使用一个可移植的解决方案,在这个类似问题的答案中给出。