【问题标题】:Allow only English letters and numbers in phpphp中只允许英文字母和数字
【发布时间】:2015-10-02 16:39:39
【问题描述】:

我正在尝试创建一个过滤器以允许用户仅使用英文字母(小写和大写)和数字。我怎样才能做到这一点? (ANSI) (不尝试清理,仅判断字符串是否包含非英文字母) 该过滤器应该为我提供一个干净的数据库,其中只有英文用户名,没有多字节和 UTF-8 字符。

谁能向我解释为什么 echo strlen(À) 输出'2'?这意味着两个字节对吗? UTF-8 字符不应该包含单个字节吗?

谢谢

【问题讨论】:

  • php.net/manual/en/function.strlen.php - 查看文档。 正在测量长度的字符串。
  • UTF-8 是一种 Unicode 转换格式。为了表示所有的字符,它有一、二、三……字节序列。你不妨写 IsUTF8LeadByte()。

标签: php encoding utf-8 filter ansi


【解决方案1】:

您应该使用正则表达式来查看字符串是否与模式匹配。这个很简单:

if (preg_match('/^[a-zA-Z0-9]+$/', $username)) {
    echo 'Username is valid';
} else {
    echo 'Username is NOT valid';
}

strlen('À') 等于 2 的原因是因为strlen 不知道该字符串是 UTF-8。尝试使用:

echo strlen(utf8_decode('À'));

【讨论】:

  • 这个正则表达式会匹配特殊字符 à 吗?
  • 不,它不会匹配重音字符,只有 26 个小写和大写字母。它们需要像这样手动添加到该表达式中: /^[a-zA-Zéèàê0-9]+$/ 例如。
  • 谢谢!正是我需要的。
【解决方案2】:

这是您检查字符串是否仅包含英文字母的方法。

if (!preg_match('/[^A-Za-z0-9]/', $string))  {
    //string contains only letters from the English alphabet
}

另一个问题:

strlen(À)

不会返回 2。也许你的意思是

strlen('À')

strlen 返回

成功时字符串的长度,如果字符串为空则为0。

取自here。因此,该字符被解释为两个字符,可能是由于您的编码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-20
    • 2013-04-26
    • 2019-02-10
    • 2014-04-11
    • 2011-03-05
    • 1970-01-01
    • 2020-11-09
    • 2011-05-19
    相关资源
    最近更新 更多