1

这是我的代码:

//Validate names have correct characters
if (preg_match("/^[a-zA-Z\s-]+$/i", $_POST['first']) == 0) {
  echo '<p class="error">Your first name must only include letters,
        dashes, or spaces.</p>';
  $okay = FALSE;
}

if(preg_match("/^[a-zA-Z\s-]+$/i", $_POST['last']) == 0) {
  echo '<p class="error">Your last name must only include letters, 
        dashes, or spaces.</p>';
  $okay = FALSE;
}

如何修改此代码以使其接受除数字以外的所有内容?

4

2 回答 2

2

韦德兰是最正确的。表示数字,\d大写\D表示非数字。所以你会有:

if (preg_match("/\d/i", $_POST['first']) > 0) {
  echo '<p class="error">Digits are not allowed, please re-enter.</p>';
  $okay = FALSE;
}

上面的意思是......如果你找到任何数字......做你的错误。又名:允许除数字之外的所有内容。

但是...我相信您需要重新考虑您的想法以允许“除数字之外的所有内容”。您通常不希望用户输入引号或特殊 ACII 字符,但您似乎希望他们能够输入-!@#$%^&*()_+=|}{\][:;<>?,./~

这似乎是一个很长的列表,但与可能字符的完整列表相比,它并没有那么长。因此,即使看起来需要更多工作,您也可能希望这样做:

if (preg_match("/[^-~`!@#$%^&*()+={}|[]\:;<>?,.\w]/i", $_POST['first']) > 0) {
echo '<p class="error">ASCII and Quotes are not accepted, please re-enter.</p>';
$okay = FALSE;
}

其中任何一个都没有开始/结束行特殊字符,因为您正在字符串中的任何位置查找这些检查是否出现(或不出现)。

我将比较运算符更改为(如果大于),因为我们不再寻找引发错误所需的东西,我们正在寻找引发错误的坏东西的存在。

另外,我从那里的最后一个正则表达式中去掉了下划线......因为单词字符 (\w) 包括数字、字母和下划线。最后,字符类中的破折号必须是列表中的第一个或最后一个,否则它有时会引发错误或被意外误认为是范围字符。

于 2013-06-09T16:24:20.463 回答
1
preg_match("/^[^0-9]*$/", $string)

接受除数字以外的所有内容。

于 2013-06-09T16:01:49.540 回答