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

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' 转义为 \'。这就是它被切断的原因。 (Reference)

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

总而言之,我认为您的正则表达式存在严重缺陷。因为您使用的是 mysqli_real_escape_string"O'Mara" 中的撇号被转义(添加反斜杠),这会导致您的 preg_match 失败。不仅如此,像 MañuellaGünterAndré 这样的人也没有机会.名字中包含破折号的人也不行 (Jean-Luc).
总的来说,最好检查一些 非常 不太可能在名称中找到的字符:

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

并不完美,但这是一个开始。您必须记住,互联网是来自世界各地的人们聚集在一起的地方。他们并不都说同一种语言,也不都共享相同的字母表(多字节字符!)。也想想我们的亚洲朋友。我的女朋友是亚洲人,她的姓只有 2 个字符。我什至无法告诉你她收到了多少次回复 "Last name must be 3 chars or more".

综合考虑:尽可能多地输入名称(不要变得愚蠢),不要使用 mysqli_real_escape_string,但要花一些时间了解准备好的语句以及如何使用他们代替。