我已经为名称编写了一个验证代码,以便用户输入(例如字母和空格)和撇号可以包含在名称表单字段中:
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
转义'
为''
。这就是为什么它被切断了。 (参考资料)
另外,请记住,有些人的姓氏中有连字符(-
),或者可以有特殊字符(如波兰ąęśźćżółń
或德语字符)。