如何使用preg_match来匹配除PHP中的数字之外的所有内容?

时间:2013-06-09 15:58:31

标签: php regex

这是我的代码:

//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;
}

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

2 个答案:

答案 0 :(得分: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;
}

上述方法......如果您发现任何数字......请执行您的错误。 aka:允许除数字之外的所有内容。

但是......我相信你需要重新思考你的想法,允许“除数字之外的一切”。您通常不希望用户输入引号或特殊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;
}

其中任何一个都不具有Beginning / End-Line特殊字符,因为您正在查找字符串中的任何位置以查找是否出现(或不出现)这些检查。

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

另外,我从最后一个正则表达式中取出了下划线...因为单词字符(\ w)包括数字,字母和下划线。最后,字符类中的破折号在列表中必须是FIRST或LAST,或者它有时会抛出错误或者意外地误认为是范围字符。

答案 1 :(得分:1)

preg_match("/^[^0-9]*$/", $string)
除了数字之外,

接受所有内容。