Санитарная обработка международного имени пользователя - PullRequest
0 голосов
/ 19 июля 2011

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

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

/[\v\t\pC\pS\p{Zl}\p{Zp}\p{Pe}\p{Pf}\p{Pi}\p{Po}\p{Ps}\p{Me}\p{No}]/u

Ян Гойваэртс имеет удобный список этих свойств .

Что бы вы сделали, чтобы наилучшим образом удовлетворить это требование? Не нужно использовать регулярное выражение.

РЕДАКТИРОВАТЬ Я скопировал ниже список свойств символов Unicode и вычеркнул те, которые будут запрещены:

  • \ p {L} или \ p {Letter}: любые буквы на любом языке.
    • \ p {Ll} или \ p {Lowercase_Letter}: строчная буква с заглавной буквы.
    • \ p {Lu} или \ p {Uppercase_Letter}: заглавная буква со строчным вариантом.
    • \ p {Lt} или \ p {Titlecase_Letter}: буква, которая появляется в начале слова, когда только первая буква слова пишется с заглавной буквы.
    • \ p {L &} или \ p {Letter &}: буква, которая существует в строчных и прописных вариантах (комбинация Ll, Lu и Lt).
    • \ p {Lm} или \ p {Modifier_Letter}: специальный символ, который используется как буква.
    • \ p {Lo} или \ p {Other_Letter}: буква или иероглиф, который не имеет строчных и прописных вариантов.
  • \ p {M} или \ p {Mark}: символ, предназначенный для объединения с другим символом (например, акценты, умлауты, заключенные в квадраты и т. Д.).
    • \ p {Mn} или \ p {Non_Spacing_Mark}: символ, предназначенный для объединения с другим символом, не занимая дополнительное место (например, ударения, умлауты и т. Д.).
    • \ p {Mc} или \ p {Spacing_Combining_Mark}: символ, предназначенный для объединения с другим символом, который занимает дополнительное место (знаки гласных во многих восточных языках). \ p {Me} или \ p {Enclosing_Mark}: символ, в который заключен этот символ, комбинируется с (круг, квадрат, колпачок и т. Д.).
  • \ p {Z} или \ p {Разделитель}: любой вид пробела или невидимый разделитель.
    • \ p {Zs} или \ p {Space_Separator}: символ пробела, который невидим, но занимает место. \ p {Zl} или \ p {Line_Separator}: символ разделителя строк U + 2028. \ p {Zp} или \ p {Paragraph_Separator}: символ разделителя абзацев U + 2029.
    \ p {S} или \ p {Symbol}: математические символы, знаки валюты, дингбаты, символы рисования коробок и т. Д. \ p {Sm} или \ p {Math_Symbol}: любой математический символ. \ p {Sc} или \ p {Currency_Symbol}: любой знак валюты. \ p {Sk} или \ p {Modifier_Symbol}: объединяющий символ (метка) как отдельный полный символ. \ p {So} или \ p {Other_Symbol}: различные символы, которые не являются математическими символами, знаками валюты или сочетанием символов.
\ p {N} или \ p {Number}: любой тип числового символа в любом скрипте.
  • \ p {Nd} или \ p {Decimal_Digit_Number}: цифры от нуля до девяти в любом сценарии, кроме идеографических.
  • \ p {Nl} или \ p {Letter_Number}: число, похожее на букву, например римская цифра. \ p {No} или \ p {Other_Number}: верхний или нижний индекс или число, которое не является цифрой 0..9 (исключая числа из идеографических сценариев).
\ p {P} или \ p {Пунктуация}: любой знак пунктуации.
  • \ p {Pd} или \ p {Dash_Punctuation}: любой вид дефиса или тире.
  • \ p {Pc} или \ p {Connector_Punctuation}: символ пунктуации, например подчеркивание, которое соединяет слова. \ p {Ps} или \ p {Open_Punctuation}: открывающая скобка любого типа. \ p {Pe} или \ p {Close_Punctuation}: любой вид закрывающей скобки. \ p {Pi} или \ p {Initial_Punctuation}: любой вид открывающей цитаты. \ p {Pf} или \ p {Final_Punctuation}: любой вид закрывающей кавычки. \ p {Po} или \ p {Other_Punctuation}: любой знак пунктуации, который не является тире, скобкой, кавычкой или соединителем.
\ p {C} или \ p {Other}: невидимые управляющие символы и неиспользуемые кодовые точки. \ p {Cc} или \ p {Control}: управляющий символ ASCII 0x00..0x1F или Latin-1 0x80..0x9F. \ p {Cf} или \ p {Format}: невидимый индикатор форматирования. \ p {Co} или \ p {Private_Use}: любая кодовая точка, зарезервированная для частного использования. \ p {Cs} или \ p {Surrogate}: половина суррогатной пары в кодировке UTF-16. \ p {Cn} или \ p {Unassigned}: любая кодовая точка, которой не был присвоен символ.

1 Ответ

0 голосов
/ 19 июля 2011

Это зависит от ваших требований. Когда вы имеете дело с регулярным выражением, трудно быть уверенным, что пунктуация на одном языке не является допустимым символом на другом. Если вы просто пытаетесь не допустить случайно введенный текст из вашей базы данных, я бы запустил это регулярное выражение через JavaScript и спросил бы пользователя, уверены ли они, что они ввели правильную информацию, если регулярное выражение находит вещи, которые не похожи на символы. Затем у пользователя есть выбор: отправлять или корректировать свое имя. Это заставляет пользователя перепроверять свою работу только в небольшом количестве обстоятельств, при которых существует высокая вероятность того, что они ввели нетекст, что не раздражает подавляющее большинство пользователей, но позволяет небольшому меньшинству с проблемными именами не застрять не удается правильно ввести их имя из-за того, что ваш код удаляет символы.

Это кажется мне лучшим подходом, поскольку вы уже храните юникод, поэтому ничто не должно нарушаться, если пользователи вводят что-то, что, по вашему мнению, может быть пунктуацией, но на самом деле это не так, и если один пользователь решает злонамеренно вводить знаки препинания кажутся низкими (зачем кому-то это делать?). Кроме того, вы можете сделать отдельное регулярное выражение на стороне сервера со стандартной пунктуацией [,.!? и т.д ...], что вы не хотите допускать ни при каких обстоятельствах.

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

...