Подтвердить что ты не робот

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

Хотя это кажется тривиальным вопросом, я уверен, что это не так :)

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

^[a-z -']+$

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

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

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

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

4b9b3361

Ответ 1

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

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

В отношении чисел есть только один случай с 8. Я думаю, что могу смело запретить это.

Что касается букв, то любая буква действительна.

Я также хочу включить пробел.

Это подводит итог этому регулярному выражению:

^[\p{L} \.'\-]+$

Это представляет собой одну проблему, то есть апостроф может использоваться как вектор атаки. Он должен быть закодирован.

Таким образом, код проверки должен быть чем-то вроде этого (untested):

var name = nameParam.Trim();
if (!Regex.IsMatch(name, "^[\p{L} \.\-]+$")) 
    throw new ArgumentException("nameParam");
name = name.Replace("'", "'");  //' does not work in IE

Может ли кто-нибудь подумать о причине, почему имя не должно проходить этот тест или XSS или SQL Injection, которые могли бы пройти?


завершенное решение

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);
            }
        }
    }
}

Ответ 2

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

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

Конечно, вам нужно санировать или избегать ввода, чтобы избежать проблемы Little Bobby Tables. И могут быть другие ограничения на то, какой ввод вы также разрешаете, например, базовые системы, используемые для хранения, рендеринга или манипулирования именами. В связи с этим я рекомендую сначала определить ограничения, необходимые для системы, к которой относится проверка, и создать выражение проверки на основе этих ограничений. Это может по-прежнему вызывать неудобства в некоторых сценариях, но они должны быть редкими.

Ответ 3

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

Есть два распространенных случая:

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

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

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

Ответ 4

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

ИЗМЕНИТЬ после разъяснения, что это пытается предотвратить XSS: Регулярное выражение в поле имени, очевидно, не остановит XSS на нем. Однако в этой статье есть раздел по фильтрации, который является отправной точкой, если вы хотите пройти этот маршрут.

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

s/[\<\>\"\'\%\;\(\)\&\+]//g;

Ответ 5

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

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

Ответ 6

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

Ответ 7

Вы можете использовать следующий код регулярного выражения для проверки 2 имен, разделенных пробелом со следующим кодом regex:

^ [A-Za-zÀ-ú] + [A-Za-zÀ-ú] + $

или просто используйте:

[[: lower:]] = [a-zà-ú]

[[: upper:]] = [A-ZÀ-Ú]

[[: alpha:]] = [A-Za-zÀ-ú]

[[: alnum:]] = [A-Za-zÀ-ú0-9]

Ответ 8

Это очень сложная проблема, чтобы проверить что-то вроде имени из-за всех возможных угловых случаев.

Угловые случаи

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

Если они хотят назвать себя Tricyclopltz ^ 2-Glockenschpiel, это их проблема, а не ваша.

Ответ 9

Очень спорный вопрос, который я, кажется, споткнулся здесь. Однако иногда ему приятно возглавлять дорогие маленькие бобби-столы на перевале и посылать маленького Роберта в кабинет директоров вместе с его полуколониями и строками комментариев SQL.

Этот REGEX в VB.NET включает в себя обычные буквенные символы и различные обведенные европейские символы. Однако бедный старый Джеймс Мак'Тристан-Смайт 3-й должен будет ввести свою родословную в качестве Джима Третьего.

<asp:RegularExpressionValidator ID="RegExValid1" Runat="server"
                    ErrorMessage="ERROR: Please enter a valid surname<br/>" SetFocusOnError="true" Display="Dynamic"
                    ControlToValidate="txtSurname" ValidationGroup="MandatoryContent"
                    ValidationExpression="^[A-Za-z'\-\p{L}\p{Zs}\p{Lu}\p{Ll}\']+$">

Ответ 10

Это отлично сработало для меня в JavaScript ^ [a-zA-Z] + [\ s | -]? [A-zA-Z] + [\ s | -]? [A-zA-Z] + $

Вот метод:

function isVallidName(name) {
    var found = name.search(/^[a-zA-Z]+[\s|-]?[a-zA-Z]+[\s|-]?[a-zA-Z]+$/);
    if(found > -1) {
        return true;
    }
    else {
        return false;
    }
}

Ответ 11

Шаги:

  • сначала удалите все акценты
  • применить регулярное выражение

Чтобы снять акценты:

private static string RemoveAccents(string s)
{
    s = s.Normalize(NormalizationForm.FormD);
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.Length; i++)
    {
        if (CharUnicodeInfo.GetUnicodeCategory(s[i]) != UnicodeCategory.NonSpacingMark) sb.Append(s[i]);
    }
    return sb.ToString();
}

Ответ 12

Это несколько помогает:

^[a-zA-Z]'?([a-zA-Z]|\.| |-)+$

Ответ 13

Этот должен работать ^([A-Z]{1}+[a-z\-\.\']*+[\s]?)* Добавьте некоторые специальные символы, если они вам понадобятся.