为了账号安全,请及时绑定邮箱和手机立即绑定

将单引号与 preg_match 和 filter_var() 函数一起使用时出现问题

将单引号与 preg_match 和 filter_var() 函数一起使用时出现问题

PHP
隔江千里 2023-09-08 21:52:39
我遇到了 filter_var()、preg_match() 和单引号的问题。我正在尝试清理和验证非法字符的姓氏。它几乎适用于所有内容,但显然姓氏中包含单引号(例如 O'Corner)会导致错误。我的意思是 $errors[] = '姓氏中请仅使用字母、句号、破折号和空格。'; 每当我在用户输入字段中使用单引号时就会执行。HTML 代码:<input type="text" class="form-control" name="last_name" id="last_name" placeholder="Enter last name" maxlength="40" required value="<?php if (isset($_POST['last_name'])) { echo htmlspecialchars($_POST['last_name'], ENT_QUOTES); } ?>" title="Alphabets, quotes, dash, spaces and max 40 characters" pattern="^[a-zA-Z][a-zA-Z' -]*$">PHP代码:$lname = filter_var($_POST['last_name'], FILTER_SANITIZE_STRING);if (!empty($lname)) {    if (!preg_match("/^[a-zA-Z][a-zA-Z' -]*$/", $lname)) {        $errors[] = 'Please use only alphabets, period, dash and spaces in last name.';    } else if (strlen($lname) > 40) {        $errors[] = 'last name should not exceed 40 characters';    } else {        $lname = trim($lname);    }} else {    $errors[] = 'Please enter your last name.';}我尝试用反斜杠转义正则表达式中的单引号。但这没有用。如果我替换$lname = filter_var($_POST['last_name'], FILTER_SANITIZE_STRING);它$lname = $_POST['lname'];效果很好。但我仍然不确定使用包含单引号和 $lname = filter_var($_POST['last_name'], FILTER_SANITIZE_STRING); 的字符串有什么问题 使用 preg_match() 方法。有人可以帮助我吗?先感谢您。
查看完整描述

1 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

您的问题来自于对 filter_var 函数的特定调用正在将单引号 ' 编码到 html 实体 ' 中。

如果您在浏览器中打印 $lname 变量,它将呈现为常规单引号,但在其源代码中它不会是引号,而是提到的 html 实体。


查看完整回答
反对 回复 2023-09-08
  • 1 回答
  • 0 关注
  • 55 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信