Регулярное выражение для проверки имен и фамилий?

Хотя это походит на тривиальный вопрос, я совершенно уверен, что это не :)

Я должен проверить имена и фамилии людей со всего мира. Вообразите огромный список миллионов имен и фамилий, куда я должен удалить, а также возможный любой хлам, я определяю. Как я могу сделать это с регулярным выражением? Если бы это были только английские, я думаю, что это сократило бы его:

^[a-z -']+$

Однако я должен поддерживать также эти случаи:

  • другие символы пунктуации, поскольку они могли бы использоваться в разных странах (никакая идея, которую, но возможно Вы делаете!)
  • различные наборы буквы Unicode (акцентируемая буква, греческий язык, японский язык, китайский язык, и так далее)
  • никакие числа или символы или ненужная пунктуация или руны, и т.д.
  • заголовки, средние инициалы, суффиксы не являются частью этих данных
  • имена уже разделяются фамилиями.
  • мы готовы вынудить крайние редкие имена быть упрощенными (существует человек, названный существующий, но не имеет смысла позволять тот символ везде. Используйте прагматизм и здравый смысл.)
  • обратите внимание, что много стран имеют законы об именах, таким образом, существуют стандарты для следования

Существует ли стандартный способ проверить эти поля, которые я могу реализовать, чтобы удостовериться, что наши пользователи веб-сайта имеют большой опыт и могут на самом деле использовать их имя при регистрации в списке?

Я искал бы что-то подобное многим "адрес электронной почты" regexes, что можно найти на Google.

38
задан Sklivvz 28 September 2019 в 13:43
поделиться

7 ответов

Я сам постараюсь дать правильный ответ:

Единственные знаки препинания, которые должны быть разрешены в имени, - это точка, апостроф и дефис. Я не видел другого дела в списке угловых.

Что касается цифр, то там » 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("'", "&#39;");
                Console.WriteLine(name);
            }
        }
    }
}
16
ответ дан 27 November 2019 в 03:12
поделиться

Я бы просто разрешил все (кроме пустой строки) и предполагал, что пользователь знает, как его зовут.

Есть 2 типичных случая:

  1. Вам важно, чтобы имя было точным и проверяются по настоящему бумажному паспорту или другому документу, удостоверяющему личность, или по кредитной карте.
  2. Вам все равно, и пользователь все равно сможет зарегистрироваться как «Фред Смит» (или «Джейн Доу»). .

В случае (1) вы можете разрешить все символы, потому что вы проверяете бумажный документ.

В случае (2) вы также можете разрешить все символы, потому что «123 456» действительно не хуже псевдоним, чем "Abc Def".

15
ответ дан 27 November 2019 в 03:12
поделиться

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.

42
ответ дан 27 November 2019 в 03:12
поделиться

Я думаю, вам будет лучше исключить символы, которые вам не нужны, с помощью регулярного выражения. Было бы безумно пытаться получить каждый умляут, букву е, дефис и т. Д. Просто исключите цифры (но как насчет парня по имени «Джордж Форман 4-й») и символы, которые, как вы знаете, вам не нужны, например @ # $% ^ или что у вас есть. Но даже в этом случае использование регулярного выражения будет гарантировать только то, что ввод соответствует регулярному выражению, он не скажет вам, что это допустимое имя

РЕДАКТИРОВАТЬ после пояснения, что это пытается предотвратить XSS: Регулярное выражение в поле имени, очевидно, не остановит XSS само по себе. Однако в этой статье есть раздел о фильтрации, который является отправной точкой, если вы хотите пойти по этому пути.

http://tldp.org/HOWTO/Secure-Programs-HOWTO/cross-site-malicious-content.html

s/[\<\>\"\'\%\;\(\)\&\+]//g;
13
ответ дан 27 November 2019 в 03:12
поделиться

Кстати, вы планируете только разрешить латинского алфавита, или вы также планируете попробовать проверить китайский, арабский, хинди и т. д.?

Как говорили другие, даже не пытайтесь сделать это. Сделайте шаг назад и спросите себя, чего вы на самом деле пытаетесь достичь. Затем попытайтесь выполнить это, не делая никаких предположений о том, как зовут людей или что они означают.

7
ответ дан 27 November 2019 в 03:12
поделиться

Проверить что-то вроде имени очень сложно из-за всех возможных угловых случаев.

Corner Cases

Дезинфицируйте входные данные и позвольте им вводить все, что они хотят для имени, потому что решение о том, какое имя является допустимым, а что нет, вероятно, выходит за рамки чего-либо ты поживаешь;

2
ответ дан 27 November 2019 в 03:12
поделиться

Я не думаю, что это хорошая идея. Даже если вы найдете подходящее регулярное выражение (возможно, используя свойства символов Unicode), это не помешает пользователям вводить псевдо-имена, такие как John Doe , Max Mustermann (даже есть человек с таким именем), Abcde Fghijk или Ababa Bebebe .

6
ответ дан 27 November 2019 в 03:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: