【问题标题】:Determine if a character is alphabetic判断一个字符是否是字母
【发布时间】:2014-10-04 12:55:36
【问题描述】:

对此有问题。

假设我有一个由单个字符组成的参数,我只想接受字母字符。如何确定传递的参数是拉丁字母(az)的成员?

顺便说一句,我使用的是 PHP Kohana 3。

谢谢。

【问题讨论】:

  • 请澄清问题:什么是字母表?也许你的意思是一个字母字符?还是字母数字字符?
  • 哦,好的,我接受纠正。字母应该是正确的术语。谢谢。

标签: php validation


【解决方案1】:

http://php.net/manual/en/function.ctype-alpha.php

<?php
    $ch = 'a';
    if (ctype_alpha($ch)) {
        // Accept
    } else {
        // Reject
    }

如果设置正确,这也会考虑到语言环境。

编辑:为了完整起见,这里的其他发帖者似乎认为您需要确保参数是单个字符,否则参数无效。要检查字符串的长度,可以使用strlen()。如果strlen()返回任何非1数,那么你也可以拒绝该参数。

就目前而言,您在回答时提出的问题表明您在某处有一个字符参数,并且您想检查它是否按字母顺序排列。我已经提供了一个通用的解决方案来做到这一点,而且对语言环境也很友好。

【讨论】:

  • 但是如果$ch 的长度超过一个字符呢?
  • 来自手册:检查提供的字符串 text 中的所有字符是否都是字母 ctype_alpha() 接受字符串。
  • 我知道ctype_alpha() 做了什么。 OP 希望拒绝所有长度超过一个字符的输入,而您的解决方案没有这样做。
  • OP 说他只有一个字符,并想检查它是否按字母顺序排列。他没有提到他需要将其限制为单个字符。据我所知,他的参数已经是一个字符。
  • 我有不同的解释。我认为需要澄清要求。让我们在明天早上的 scrum 中与 OP 讨论它。 :)
【解决方案2】:

在方法的顶部使用以下保护子句:

if (!preg_match("/^[a-z]$/", $param)) {
    // throw an Exception...
}

如果您也想允许大写字母,请相应地更改正则表达式:

if (!preg_match("/^[a-zA-Z]$/", $param)) {
    // throw an Exception...
}

另一种支持不区分大小写的方法是使用/i不区分大小写修饰符:

if (!preg_match("/^[a-z]$/i", $param)) {
    // throw an Exception...
}

【讨论】:

  • preg_match("/^[a-z]$/i", $param) 或不区分大小写
  • 你的 cmets 倒退了。如果 preg_match 成功匹配 [a-z],则不应抛出异常。 if(!preg_match(...)) { 例外! }
  • @Nick Presta:很好的收获。我在条件中添加了!。谢谢:)
  • 正则表达式很好,但很多时候你使用一个,即使是微不足道的,你重新发明轮子并为错误引入接触面。我更喜欢php.net/manual/en/book.ctype.php
  • 嗯,that’s almost always wrong。你想要/^\p{Alphabetic}+$/
【解决方案3】:
preg_match('/^[a-zA-Z]$/', $var_vhar);

方法将返回int值:不匹配返回0,匹配返回1。

【讨论】:

  • 正则表达式很好,但很多时候你使用一个,即使是微不足道的,你重新发明轮子并为错误引入接触面。我更喜欢 php.net/manual/en/book.ctype.php
【解决方案4】:

正如尼克建议的那样,我会使用 ctype,因为它不仅比正则表达式快,而且比 PHP 中内置的大多数字符串函数还要快。但您还需要确保它是单个字符:

if (ctype_alpha($ch) && strlen($ch) == 1) {
    // Accept
} else {
    // Reject
}

【讨论】:

  • 不,你没有。 ctype_alpha 检查整个字符串。请参阅手册。
  • 我知道确实如此。但他只希望参数是单个字符。所以如果字符串是AB,它应该被拒绝,不管它们是否都用ctype_alpha检查。查看问题。
  • 也许应该看到这个问题。 OP 声明他已经有一个字符参数。他想检查该参数是否按字母顺序排列。检查参数的长度是调用者的责任,或者至少不应该在这里处理,因为 OP 从未要求过这个,并且与“确定字符是否为字母”的问题无关。跨度>
【解决方案5】:

您不能将 [a-zA-Z] 用于 Unicode。

这里是使用 Unicode 的示例,

if ( preg_match('/^\p{L}+$/u', 'my text') ) {
    echo 'match';
} else {
    echo 'not match';
}

【讨论】:

    【解决方案6】:

    希望这会有所帮助。这是 php 中的一个简单函数,名为 ctype_alpha

    $mystring = 'a'
    if (ctype_alpha($mystring))
    {
        //Then do the code here.
    }
    

    【讨论】:

    • 仅供参考;这里已经有两个答案提供了有关使用 ctype_alpha 的信息,每个答案都是 4 年前发布的。这些答案还包括更多解释,并将示例集成到 OP 的代码正在执行的操作中。一般来说,如果你有一些实质性的东西要添加,你应该只添加一个非常古老的问题的答案。
    【解决方案7】:

    你可以试试:

    preg_match('/^[a-zA-Z]$/',$input_char);
    

    如果 $input_char 包含单个字母,则上述函数的返回值为 true,否则为 false。可以适当利用返回值。

    【讨论】:

      猜你喜欢
      • 2010-09-10
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-12
      • 2013-03-11
      相关资源
      最近更新 更多