正则表达式导致名称的一部分被删除


Regex is causing part of a name to be dropped

我已经为名称编写了一个验证代码,以便用户输入(例如字母和空格)和撇号可以包含在名称表单字段中:

if (!preg_match("/^[a-zA-Z' ]*$/",$name)) {
    $name = "";
    $nameErr = "Only letters and white space allowed";
}  

我也有

$name = mysqli_real_escape_string($con, $_POST['name']);

在相同的代码中,因为我不希望引擎认为字符串的末尾已经到达,而实际上它还没有。但我的问题是,当我在名称表单字段中输入像 Kate O'Mara 这样的名字时,最终会出现在数据库中的 Kate O。为什么会这样?你清楚地看到的正则表达式内部有一个撇号(你甚至不必转义它,因为它在字符类内)。为什么姓氏撇号后面的所有东西都被去掉了?正则表达式应该识别全名。

总而言之,我认为您的正则表达式存在严重缺陷。因为您使用的是 mysqli_real_escape_string所以"O'Mara"中的撇号被转义(添加反斜杠),这会导致您的preg_match失败。不仅如此,像马努埃拉君特安德烈这样名字的人也没有机会。名字中包含破折号的人也没有(让-吕克)。
总的来说,最好检查一些不太可能在名称中找到的字符:

if (preg_match('/[@#$%*=+&![']{};?]/', $name))

并不完美,但这是一个开始。你必须记住,互联网是来自世界各地的人们聚集在一起的地方。它们并不都说同一种语言,也不都共享相同的字母表(多字节字符!还要想想我们的亚洲朋友。我的女朋友是亚洲人,她的姓氏只有2个字符。我什至无法告诉你她有多少次得到"姓氏必须是 3 个字符或更多"的回复。

所有考虑因素:在名称输入时尽可能多地允许(不要变得愚蠢),并且不要使用 mysqli_real_escape_string ,但花一些时间学习准备好的语句以及如何使用它们。

mysqli_real_escape_string

'''。这就是为什么它被切断了。 (参考资料)

另外,请记住,有些人的姓氏中有连字符(-),或者可以有特殊字符(如波兰ąęśźćżółń或德语字符)。