我会尝试自己给出一个正确的答案:
名称中唯一应该允许的标点符号是句号、撇号和连字符。我在极端案例列表中没有看到任何其他案例。
关于数字,只有一种情况是 8。我想我可以放心地拒绝这种情况。
关于信件,任何信件都是有效的。
我也想包括空间。
这将总结为这个正则表达式:
^[\p{L} \.'\-]+$
这提出了一个问题,即撇号可以用作攻击向量。它应该被编码。
所以验证代码应该是这样的(未经测试):
var name = nameParam.Trim();
if (!Regex.IsMatch(name, "^[\p{L} \.\-]+$"))
throw new ArgumentException("nameParam");
name = name.Replace("'", "'"); //' does not work in IE
谁能想到一个名字不应该通过这个测试的原因,或者一个可以通过的 XSS 或 SQL 注入?
完整的测试解决方案
using System;
using System.Text.RegularExpressions;
namespace test
{
class MainClass
{
public static void Main(string[] args)
{
var names = new string[]{"Hello World",
"John",
"João",
"タロウ",
"やまだ",
"山田",
"先生",
"мыхаыл",
"Θεοκλεια",
"आकाङ्क्षा",
"علاء الدين",
"אַבְרָהָם",
"മലയാളം",
"상",
"D'Addario",
"John-Doe",
"P.A.M.",
"' --",
"<xss>",
"\""
};
foreach (var nameParam in names)
{
Console.Write(nameParam+" ");
var name = nameParam.Trim();
if (!Regex.IsMatch(name, @"^[\p{L}\p{M}' \.\-]+$"))
{
Console.WriteLine("fail");
continue;
}
name = name.Replace("'", "'");
Console.WriteLine(name);
}
}
}
}