【问题标题】:Making sure a string only contains numbers, letters, and underscores with PHP?使用 PHP 确保字符串只包含数字、字母和下划线?
【发布时间】:2015-08-25 19:30:23
【问题描述】:

所以,我知道我需要一个正则表达式,并使用preg_match()

documentation for preg_match() 表示如果偏移量大于字符串长度,该函数将返回 false 或 false-ish。我将文档解释为如果没有匹配项,它将返回 false。

我不喜欢正则表达式,但是在阅读了它们on this site 之后,我尝试编写一个函数来满足我的需求。它不工作。

我有以下sn-p:

  if (preg_match('/^[a-zA-Z0-9_]+/', $requested_table_name) === false) {
      echo "Invalid String";
  } else {
      echo "You're golden, Ponyboy";
  }

如果我正确理解反斜杠开始和结束正则表达式,克拉告诉表达式从字符串的开头开始。字符类表示匹配小写字母、大写字母、数字或下划线的字符,然后+ 符号表示将该字符集匹配到整个字符串,而不仅仅是字符串的第一个字符.

我一定是弄错了,因为我的程序的输出表明无论输入如何,字符串都是有效的。

我的代码的问题是使用preg_match() 函数,还是我的正则表达式的语法?无论哪种情况,具体是什么问题,我该如何解决?

【问题讨论】:

  • 使用锚点:/^[a-zA-Z0-9_]+$/
  • 只需使用\w+^\w+$(使用锚点来检查完整的字符串)。 \w 是字母数字字符和下划线。 regular-expressions.info/shorthand.html\w stands for "word character". It always matches the ASCII characters [A-Za-z0-9_]
  • @anubhava 这似乎也不起作用。
  • 请提供$requested_table_name所包含内容的样本。
  • @Allenph 例如,/x+/ 表示“匹配一个或多个 x”,/[0-9]+/ 表示“匹配一个或多个数字”。如果要匹配整个字符串,则必须使用锚点。因此,/[0-9]+/ 表示“字符串必须在任何位置包含一位或多位数字”,/^[0-9]+/ 表示“字符串必须在开头包含一位或多位数字”,/[0-9]+$/ 表示“字符串必须包含一位或多位数字结尾”,/^[0-9]+$/ 表示“整个字符串必须只包含一位或多位数字。”

标签: php regex string validation preg-match


【解决方案1】:

您的正斜杠是分隔符。 ^ 确实说 start of string[a-zA-Z0-9_]+ 确实列出了您想要允许的字符一次或多次。但是,在那之后一次或多次您允许任何事情,例如A! 是有效的,因为它以 A 开头。如果您锚定该表达式,您将确保只允许这些字符。

=== false 不正确,因为返回的是0,或者1,而不是false

演示(检查不正确,尚未回答):

<?php
$string = 'asdf2341234_';
$return = preg_match('/^[a-zA-Z0-9_]+$/', $string);
if ($return === false){
    echo 'is false';
} else {
    echo 'not false';
}
var_dump($return);

所以你的正则表达式应该是...

if (!preg_match('/^\w+$/', $string)) {
    echo "Invalid String" . $string . "\n";
} else {
    echo "You're golden, Ponyboy"  . $string . "\n";
}

或者...

if (!preg_match('/^[a-zA-Z0-9_]+$/', $string)) {
    echo "Invalid String" . $string . "\n";
} else {
    echo "You're golden, Ponyboy"  . $string . "\n";
}

或者...

if (!preg_match('/^[a-z\d_]+$/i', $string)) {
    echo "Invalid String" . $string . "\n";
} else {
    echo "You're golden, Ponyboy"  . $string . "\n";
}

您可以在 regex101.com 上测试正则表达式。它解释了您输入的所有内容。

【讨论】:

    【解决方案2】:

    使用正则表达式,您走在正确的道路上。您正在尝试删除任何不需要的字符,因此请查看 preg_replace

    一些 cmets 提到了诸如 \w 之类的速记匹配单个字母、数字或下划线。还有\W(大写)匹配任何非字母、数字或下划线的单个字符。

    这会做你想做的事:$sanitized_input = preg_replace("/\W/", "", $input);

    或者,不使用速记,注意 ^ 否定 [class] 中的字符:$sanitized_input = preg_replace("/[^a-zA-Z0-9_]/", "", $input);

    请务必检查 preg_replace 返回的内容是否是您想要的(即检查 null 是否失败)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      • 2013-06-03
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      相关资源
      最近更新 更多