正则表达式导致部分名称被删除
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ñuella、Günter 或 André 这样的人也没有机会.名字中包含破折号的人也不行 (Jean-Luc).
总的来说,最好检查一些 非常 不太可能在名称中找到的字符:
if (preg_match('/[@#$%*=+&![\]{};?]/', $name))
并不完美,但这是一个开始。您必须记住,互联网是来自世界各地的人们聚集在一起的地方。他们并不都说同一种语言,也不都共享相同的字母表(多字节字符!)。也想想我们的亚洲朋友。我的女朋友是亚洲人,她的姓只有 2 个字符。我什至无法告诉你她收到了多少次回复 "Last name must be 3 chars or more".
综合考虑:尽可能多地输入名称(不要变得愚蠢),不要使用 mysqli_real_escape_string
,但要花一些时间了解准备好的语句以及如何使用他们代替。
我已经为姓名编写了验证代码,以便用户输入(例如字母和空格以及撇号)可以包含在姓名表单字段中:
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ñuella、Günter 或 André 这样的人也没有机会.名字中包含破折号的人也不行 (Jean-Luc).
总的来说,最好检查一些 非常 不太可能在名称中找到的字符:
if (preg_match('/[@#$%*=+&![\]{};?]/', $name))
并不完美,但这是一个开始。您必须记住,互联网是来自世界各地的人们聚集在一起的地方。他们并不都说同一种语言,也不都共享相同的字母表(多字节字符!)。也想想我们的亚洲朋友。我的女朋友是亚洲人,她的姓只有 2 个字符。我什至无法告诉你她收到了多少次回复 "Last name must be 3 chars or more".
综合考虑:尽可能多地输入名称(不要变得愚蠢),不要使用 mysqli_real_escape_string
,但要花一些时间了解准备好的语句以及如何使用他们代替。