为什么ctype_alnum在匹配与文化无关的字母数字方面没有帮助?

时间:2015-11-18 12:09:39

标签: php regex validation

假设我在一个名为$text的变量中有一个文本,我想验证它,以便它可以包含空格,下划线,点和来自任何语言和任何数字的任何字母。由于我是一个带有正则表达式的总菜鸟,我以为我可以解决这个问题,就像这样:

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

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

  • foobarloremipsum
  • foobarloremipsu1m
  • foobarloremi psu1m
  • foobar._remi psu1m

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

  

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

Source

我认为需要更改设置以允许非英文字母,但是当且仅当$text仅包含与文化无关的字母或数字时,如何使用ctype_alnum返回true?< / p>

或者,我知道可以使用一些幽灵般的正则表达式来解决这个问题,包括\p{L}这样的问题很好,但我很想知道是否可以使用ctype_alnum

1 个答案:

答案 0 :(得分:1)

您需要setlocale category设置为LC_CTYPEctype_*系列函数的相应区域设置才能处理非英文字符。

请注意,您与locale一起使用的setlocale需要在系统上实际安装,否则无法正常工作。解决这种情况的最佳方法是使用便携式解决方案,给定in this answer to a similar question