1

I want a variable that allow letters and only, not digits.

And that variable can be at any position in the string.

Look at this,

$pattern = '~user/(:var)~';

$pattern = str_replace('(:var)', '([a-zA-Z])', $pattern);

// Note, the variable contain both numbers and letters
$test = 'user/dave123';

$r = preg_match($pattern, $test); 

var_dump($r); //1 Success (I don't want this)

All I want is,

If a variable contain letters only, then preg_match() should return 1, but if that one contains at least one digit, then preg_match() should immediately return 0,

What regex should be defined instead of ([a-zA-Z]) and why ([a-zA-Z]) matches both numbers and letters!?

4

4 回答 4

6

正则表达式匹配您的测试值的这个子字符串:user/d.

如果要检查整个字符串,请将 start ( ^) 和 end ( $) 锚点添加到您的模式中:

$pattern = '~^user/(:var)$~';

要检查字符串的开始/结束另一个分隔符,例如/,它看起来像这样:

$pattern = '~(?:^|/)user/(:var)(?:$|/)~';

这将迫使它考虑整个值,直到字符串的结尾或下一个/......防止像您在问题中遇到的部分匹配。

?:表示非捕获组,这意味着额外的()组不会出现在您的匹配结果列表中)

您还需要允许[a-zA-Z]该类使用 重复+,否则它将仅匹配单字符用户名:

$pattern = str_replace('(:var)', '([a-zA-Z]+)', $pattern);
于 2013-06-17T04:27:15.843 回答
3

您需要分别使用^and开始结尾$

'~^user/(:var)$~'

它匹配,因为您的字符串中有user, dave

于 2013-06-17T04:27:32.493 回答
1

您的模式表示“az 或 AZ 之间的任何字符之一”,这就是它匹配的原因。它不提供检查以查看它是否是唯一匹配的内容,并且它不会匹配重复的字符。

为什么不尝试更简单的方法,而不是那种方法。因为您只想知道字符串是否包含数字:

$haystack = 'user/dave123';
foreach(range(0,9) as $i) {
    if (strpos($haystack,$i) === FALSE)) {
         return 1;
    }
}
return 0;

这将在找到的第一个数字处停止。

于 2013-06-17T04:35:02.980 回答
0

该模式可能与字符串中的第一个字符匹配,而与整个字符串不匹配。要匹配整个字符串,请尝试

"/^[a-z]+$/i"

这应该给你一个不区分大小写的字母,只匹配整个字符串(^并且$是字符串的开头和字符串 分隔符的结尾)。

还有一些方便的内置 PHP 函数ctype_alpha(),它们的作用完全相同。

于 2013-06-17T04:31:10.747 回答