String.withCString является аналогом String.getBytes в Java (void). Используйте это так (добавлен дополнительный набор текста):
let s = "42"
s.withCString {
( bytes : (UnsafePointer<CChar>) ) -> Void in
let k = atoi(bytes)
println("k is \(k)")
}
Я сам постараюсь дать правильный ответ:
Единственные знаки препинания, которые должны быть разрешены в имени, - это точка, апостроф и дефис. Я не видел другого дела в списке угловых.
Что касается цифр, то там » s только один случай с 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);
}
}
}
}
Я бы просто разрешил все (кроме пустой строки) и предполагал, что пользователь знает, как его зовут.
Есть 2 типичных случая:
В случае (1) вы можете разрешить все символы, потому что вы проверяете бумажный документ.
В случае (2) вы также можете разрешить все символы, потому что «123 456» действительно не хуже псевдоним, чем "Abc Def".
I sympathize with the need to constrain input in this situation, but I don't believe it is possible - Unicode is vast, expanding, and so is the subset used in names throughout the world.
Unlike email, there's no universally agreed-upon standard for the names people may use, or even which representations they may register as official with their respective governments. I suspect that any regex will eventually fail to pass a name considered valid by someone, somewhere in the world.
Of course, you do need to sanitize or escape input, to avoid the Little Bobby Tables problem. And there may be other constraints on which input you allow as well, such as the underlying systems used to store, render or manipulate names. As such, I recommend that you determine first the restrictions necessitated by the system your validation belongs to, and create a validation expression based on those alone. This may still cause inconvenience in some scenarios, but they should be rare.
Я думаю, вам будет лучше исключить символы, которые вам не нужны, с помощью регулярного выражения. Было бы безумно пытаться получить каждый умляут, букву е, дефис и т. Д. Просто исключите цифры (но как насчет парня по имени «Джордж Форман 4-й») и символы, которые, как вы знаете, вам не нужны, например @ # $% ^ или что у вас есть. Но даже в этом случае использование регулярного выражения будет гарантировать только то, что ввод соответствует регулярному выражению, он не скажет вам, что это допустимое имя
РЕДАКТИРОВАТЬ после пояснения, что это пытается предотвратить XSS: Регулярное выражение в поле имени, очевидно, не остановит XSS само по себе. Однако в этой статье есть раздел о фильтрации, который является отправной точкой, если вы хотите пойти по этому пути.
http://tldp.org/HOWTO/Secure-Programs-HOWTO/cross-site-malicious-content.html
s/[\<\>\"\'\%\;\(\)\&\+]//g;
Кстати, вы планируете только разрешить латинского алфавита, или вы также планируете попробовать проверить китайский, арабский, хинди и т. д.?
Как говорили другие, даже не пытайтесь сделать это. Сделайте шаг назад и спросите себя, чего вы на самом деле пытаетесь достичь. Затем попытайтесь выполнить это, не делая никаких предположений о том, как зовут людей или что они означают.
Проверить что-то вроде имени очень сложно из-за всех возможных угловых случаев.
Дезинфицируйте входные данные и позвольте им вводить все, что они хотят для имени, потому что решение о том, какое имя является допустимым, а что нет, вероятно, выходит за рамки чего-либо ты поживаешь;
Я не думаю, что это хорошая идея. Даже если вы найдете подходящее регулярное выражение (возможно, используя свойства символов Unicode), это не помешает пользователям вводить псевдо-имена, такие как John Doe , Max Mustermann (даже есть человек с таким именем), Abcde Fghijk или Ababa Bebebe .