如何验证字符串只包含小写字母


How to validate that a string only contain lowercase letters?

我正在尝试验证我的字符串是否匹配模式。也就是说,整个字符串可以写成这种模式。但是,如果任何子字符串匹配该模式,则preg_match返回true。(例如,preg_match("#[a-z]*#, "333k")返回1,这是我不想要的。在本例中,我宁愿验证整个字符串只包含小拉丁字母。)

使用startend标记,分别为^$,来指示正则表达式模式中字符串的开始和结束。这样就可以使表达式只匹配整个字符串,而不是任何类型的子字符串。在你的例子中,它看起来像这样:

preg_match("#^[a-z]*$#", "333k");

您还可以使用其中一个标记指定模式必须只匹配字符串的开头或结尾。

请注意,$锚也匹配在字符串最末尾的换行字符序列之前(是的,即使没有指定m MULTILINE标志)。看看这些测试,它们都返回一个匹配:

if (preg_match("#^[a-z]*$#", "ok")) echo "OK!'n"; // => is OK!
if (preg_match("#^[a-z]*$#", "ok'n")) echo "OK!'n"; // => is OK!
if (preg_match("#(*ANY)^[a-z]*$#", "ok'r'n")) echo "OK!"; // => is also OK!

您可以通过使用D修饰符来"修复"$行为。符合pcre的 PCRE_DOLLAR_ENDONLY 修饰符使$锚匹配在字符串的非常末尾(不包括字符串中最后一个换行符之前的位置)。

/^'d+$/D

等于

/^'d+'z/

和匹配由1个或多个数字组成的整个字符串,将不匹配"123'n",但将匹配"123"

或者,要将字符串匹配锚定在非常字符串的开始和结束处,您还可以考虑使用 'A 'z锚定

preg_match('~'A[a-z]*'z~', "333k");
             ^^      ^^

'A'z是PHP regex中明确的字符串锚的开始和结束(因为它们的行为不依赖于任何regex修饰符,即使您指定m MULTILINE修饰符,它们将继续断言字符串的开始/结束位置)。在PHP文档中查看更多关于PHP regex锚的信息。

注意'Z: 'Z将在最后一个换行符之前匹配整个字符串,而'z将只匹配字符串的非常末尾,也就是说,在字符串中所有字符之后(参见正则表达式中'z和'z的区别是什么以及何时和如何使用它?)

我超级喜欢regex,但不适合这个任务——它是不必要的开销,因为有一个单一的、直接的、非regex等效的。https://www.php.net/manual/en/function.ctype-lower.php

代码(演示):

$tests = [
    'Test',
    'test',
    'test1',
    '1test',
    'test!'
];
foreach ($tests as $test) {
    echo "$test: " , (ctype_lower($test) ? 'true' : 'false') , "'n";
}
输出:

Test: false
test: true
test1: false
1test: false
test!: false

注。对于该记录,空字符串返回false。我不确定您对这个测试单元的逻辑验证要求。