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

时间:2013-05-04 15:21:53

标签: php regex string validation preg-match

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

3 个答案:

答案 0 :(得分:16)

分别使用 start end 标记^$来指示正则表达式中字符串的开头和结尾图案。这样,您可以使表达式仅匹配整个字符串,而不是任何类型的子字符串。在你的情况下,它看起来像这样:

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

您还可以使用这些标记指定模式必须仅匹配字符串的开头或结尾。

答案 1 :(得分:2)

请注意,$锚也位于字符串最后一行的换行符序列之前(是的,即使未指定m MULTILINE标志)。见these tests, all returning a match

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"

或者,要将字符串匹配锚定在 非常 字符串的开头和结尾,您也可以考虑使用 {{ 1}} \A主播

\z

PHP正则表达式中preg_match('~\A[a-z]*\z~', "333k"); ^^ ^^ \A 明确字符串锚点的开始和结束(因为它们的行为不依赖于任何正则表达式修饰符,即使您指定了\z MULTILINE修饰符,它们将继续断言字符串开始/结束位置)。请参阅PHP documentation中有关PHP正则表达式锚点的更多信息。

谨防m但是:\Z将匹配最后一个换行符之前的整个字符串,而\Z只会匹配字符串的最后一行,即在字符串中有所有字符之后(参见Whats the difference between \z and \Z in a regular expression and when and how do I use it?

答案 2 :(得分:0)

我超级喜欢正则表达式,但是不喜欢这个任务-这是不必要的开销,因为只有一个直接的非正则表达式等效项。 https://www.php.net/manual/en/function.ctype-lower.php

代码:(Demo

$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

p.s。为了记录,空字符串返回false。我不确定您对此测试单元的逻辑验证要求。