【问题标题】:When validating a form submission, allow any character验证表单提交时,允许任何字符
【发布时间】:2020-10-30 00:25:21
【问题描述】:

目前我在 php 中运行脚本以允许在用户名是“有效”的情况下提交文件,即仅使用字符和数字。如果不是这种情况,用户将返回到该 url,并在该 url 中显示一条错误消息,显示“invalidusername”。

我试图在我的网站上使用一个功能来模仿这个脚本,只要“标题”有效,即允许人们将表单上传到网站,即只有数字和字符,就像用户名一样。但是,我在标题中意识到我实际上希望使所有字符都能够在标题中使用。我应该删除脚本吗?或者,有没有办法让preg_match() 启用所有字符。我在网上试过php脚本,但没有奏效。我的代码如下:

if (empty($author) || empty($title) || empty($year) || empty($url) || empty($keywords)) {
    header("Location: ../upload.php?error=emptyfields");
    exit();
} else if (!preg_match("/^[a-zA-Z0-9]*$/", $title) && !filter_var($url, FILTER_VALIDATE_URL)) {
    header("Location: ../upload.php?error=invalidtitleurl");
    exit();
} else if (!preg_match("/^[a-zA-Z0-9]*$/", $title)) {
    header("Location: ../upload.php?error=invalidtitle");
    exit();
}

【问题讨论】:

  • 请务必将您的预期结果与您的输入一起添加。会有帮助的。
  • [\s\S] 匹配所有个字符。

标签: php regex validation preg-match


【解决方案1】:

几个提示:

  1. 当您发现自己想要使用 preg_match("/^[a-zA-Z0-9]*$/", ...) 来匹配仅由字母数字字符组成的字符串(并且该字符串不能为空)时,您应该使用非正则表达式等效的 ctype_alnum()

  2. 如果您没有验证title 提交的质量,而只是验证该值的长度为正。您可以使用 isset() 函数(或 null 合并运算符)确保元素存在,然后使用 strlen() 确保该值包含多个字符。

  3. 在 php 中,else if 应该是一个单词以符合PSR-12 coding standards

  4. 使用empty() 的问题在于,如果有人提交的字符串值为零,那么empty() 将拒绝/重定向他们的提交,因为empty('0') === true。这是一个边缘案例吗?是的,但是如果他们没有做错事,你不想激怒你的用户。如果您在所有验证检查中都使用empty(),则用户名为0 的用户在访问您的站点时会遇到很多困难。值得深思。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多