我正在尝试验证我的字符串是否与模式匹配。也就是说,完整的字符串可以写为该模式。
但是,preg_match
返回true
,如果任何子字符串匹配该模式。
(例如preg_match("#[a-z]*#, "333k")
返回1
,我不想这样做。
在这个例子中,我宁愿验证,整个字符串只包含小的拉丁字母。)
答案 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
。我不确定您对此测试单元的逻辑验证要求。