确定一个字符是否为字母

16

遇到问题了。

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

顺便说一下,我正在使用 PHP Kohana 3。

谢谢。


请澄清问题:什么是“字母表”?也许您的意思是字母字符?还是数字字母字符? - wallyk
哦,好的,我被纠正了。字母表应该是正确的术语。谢谢。 - Ed.
7个回答

26

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

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

如果您正确地设置了区域设置,这也会考虑到它。

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

目前而言,在回答时,您的问题表明您在某个地方有一个单个字符参数,并且您想检查它是否为字母。 我提供了一种通用解决方案,可以做到这一点,并且还适用于区域设置。


但是如果 $ch 的长度超过一个字符呢? - Asaph
1
从手册中:检查提供的字符串text中的所有字符是否都是字母 ctype_alpha() 接受一个字符串。 - Nick Presta
我知道 ctype_alpha() 的作用。OP想要拒绝所有超过一个字符长度的输入,而你的解决方案并没有做到这一点。 - Asaph
1
OP说他有一个单一的字符,并想要检查它是否为字母。他没有提到需要将其限制为单个字符。据我所知,他的参数已经是单个字符了。 - Nick Presta
2
我有不同的理解。我认为需要澄清需求。让我们在明天早上的Scrum中与OP讨论一下。 :) - Asaph

17

在你的方法顶部使用以下守卫语句:

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) 或使用不区分大小写的匹配 - Xorlev
你的注释写反了。如果 preg_match 成功匹配 [a-z],那么你不应该抛出异常。if(!preg_match(...)) { 抛出异常! } - Nick Presta
@Nick Presta:好发现。我在条件中添加了一个 !。谢谢 :) - Asaph
2
正则表达式是可以的,但在很多情况下你可能会重复造轮子,引入错误的接触面,即使只是使用一个琐碎的正则表达式。我更喜欢使用 http://php.net/manual/en/book.ctype.php 。 - Sebastian Mach
1
嗯,那几乎总是错误的。你应该使用/^\p{Alphabetic}+$/ - tchrist

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

这个方法将返回一个整数值:如果没有匹配项,则返回0;如果有匹配项,则返回1。


1
正则表达式很好用,但很多时候即使是琐碎的任务,你使用正则表达式也会重新发明轮子,并引入错误的接触面。我更喜欢php.net/manual/en/book.ctype.php。 - Sebastian Mach
1
A-Z已经过时。 - tchrist

1

我会像Nick建议的那样使用ctype,因为它不仅比正则表达式更快,甚至比PHP内置的大多数字符串函数都要快。但你还需要确保它是单个字符:

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

不,你不需要这样做。ctype_alpha会检查整个字符串。请参阅手册。 - Nick Presta
2
我知道这会这样做。但是他只想让参数成为单个字符。因此,如果字符串是 AB,则应该被拒绝,不管它们是否都使用 ctype_alpha 进行了检查。请参见问题。 - Anthony
也许您应该看一下问题。OP声明他已经有了一个单字符参数。他想检查该参数是否为字母。检查参数的长度是调用者的责任,或者至少不应在此处处理,因为OP从未要求过这一点,也与问题“确定字符是否为字母”无关。 - Nick Presta

1

你不能使用 [a-zA-Z] 匹配 Unicode。

以下是与 Unicode 相关的示例:

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

1

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

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

2
仅供参考,这里已经有两个回答提供了有关使用 ctype_alpha 的信息,每个回答都发布了超过4年。这些答案还包括更多的解释,并将示例集成到OP代码正在执行的内容中。一般来说,只有在您有实质性内容添加时才应该向像这样的非常老的问题添加答案。 - Andrew Barber

0

你可以尝试以下方法:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接