Пакет валидоторов govalidator

276 views
Skip to first unread message

Алексей Саскевич

unread,
Jun 22, 2014, 11:51:56 AM6/22/14
to gola...@googlegroups.com
GoValidator - набор валидаторов строк. Пакет был портирован с оригинальной JS версии validator.js
К портированию библиотеки меня подтолкнули следующие причины - необходимость в валидации строк, и, как следствие, отсутствие аналогов для Go (хотя возможно они все-таки есть).
 
На данный момент пакет предлагает к использованию следующие функции:
func BlackList(str, chars string) string
func Contains(str, substr string) bool
func IsASCII(str string) bool
func IsAlpha(str string) bool
func IsAlphanumeric(str string) bool
func IsByteLength(str string, min, max int) bool
func IsCreditCard(str string) bool
func IsDivisibleBy(str, num string) bool
func IsEmail(str string) bool
func IsFloat(str string) bool
func IsFullWidth(str string) bool
func IsHalfWidth(str string) bool
func IsHexadecimal(str string) bool
func IsHexcolor(str string) bool
func IsISBN(str string, version int) bool
func IsInt(str string) bool
func IsJSON(str string) bool
func IsLowerCase(str string) bool
func IsMultibyte(str string) bool
func IsNull(str string) bool
func IsNumeric(str string) bool
func IsURL(str string) bool
func IsUUID(str string, version int) bool
func IsUpperCase(str string) bool
func IsVariableWidth(str string) bool
func LeftTrim(str, chars string) string
func Matches(str, pattern string) bool
func ReplacePattern(str, pattern, replace string) string
func RightTrim(str, chars string) string
func StripLow(str string, KeepNewLines bool) string
func ToBoolean(str string) bool
func ToFloat(str string) float64
func ToInt(str string) int64
func ToString(obj interface{}) string
func Trim(str, chars string) string
func WhiteList(str, chars string) string
Документация к каждой функции доступна тут: https://gowalker.org/github.com/asaskevich/govalidator
Сам репозиторий с пакетом находится тут: http://github.com/asaskevich/govalidator

К сожалению, я не знаю, как правильно оформить топик, потому оформил как мог. Надеюсь на ваше объективное мнение и идеи. :)

Anton Ageev

unread,
Jun 22, 2014, 12:20:42 PM6/22/14
to gola...@googlegroups.com
1. Часть функций дублируют стандартную библиотеку (Contains, IsAlpha, etc.). Зачем?
2. Пользы от жестко зашитых паттернов не очень много. В разных задачах приходится валидировать тот же e-mail по разному.
3. Из пункта 2 вытекает то, что непонятны критерии выбора паттернов для валидации. Почему, к примеру, IsURL не считает валидным URL "//google.com/" или "file:///etc/passwd"?


--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.



--
WBR, Anton

Игорь Хазиев

unread,
Jun 22, 2014, 3:45:06 PM6/22/14
to gola...@googlegroups.com
On Sun, Jun 22, 2014 at 7:51 PM, Алексей Саскевич <bwa...@gmail.com> wrote:
К сожалению, я не знаю, как правильно оформить топик, потому оформил как мог. Надеюсь на ваше объективное мнение и идеи. :)
 
Не парься, это просто рассылка, не назвал тему 'Новый пакет' и ладно. :-) В принципе функции полезные, и как правило, в том или ином виде они пишутся в разных компаниях, и почему их нет в стандартной библиотеке, непонятно.

22 июня 2014 г., 20:20 пользователь Anton Ageev <ant...@gmail.com> написал:
2. Пользы от жестко зашитых паттернов не очень много. В разных задачах приходится валидировать тот же e-mail по разному.
3. Из пункта 2 вытекает то, что непонятны критерии выбора паттернов для валидации. Почему, к примеру, IsURL не считает валидным URL "//google.com/" или "file:///etc/passwd"?
 
А адреса почты или сайтов вообще лучше не проверять. На почту отправить письмо, а сайт загрузить. Если письмо не отправилось или сайт не загрузился, анализировать возвращаемое функцией значение.

Dmitry Vyukov

unread,
Jun 22, 2014, 3:50:34 PM6/22/14
to gola...@googlegroups.com
2014-06-22 12:45 GMT-07:00 Игорь Хазиев <bior...@gmail.com>:
>> On Sun, Jun 22, 2014 at 7:51 PM, Алексей Саскевич <bwa...@gmail.com>
>> wrote:
>> К сожалению, я не знаю, как правильно оформить топик, потому оформил как
>> мог. Надеюсь на ваше объективное мнение и идеи. :)
>
>
> Не парься, это просто рассылка, не назвал тему 'Новый пакет' и ладно. :-) В
> принципе функции полезные, и как правило, в том или ином виде они пишутся в
> разных компаниях, и почему их нет в стандартной библиотеке, непонятно.


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



>> 22 июня 2014 г., 20:20 пользователь Anton Ageev <ant...@gmail.com>
>> написал:
>>
>> 2. Пользы от жестко зашитых паттернов не очень много. В разных задачах
>> приходится валидировать тот же e-mail по разному.
>> 3. Из пункта 2 вытекает то, что непонятны критерии выбора паттернов для
>> валидации. Почему, к примеру, IsURL не считает валидным URL "//google.com/"
>> или "file:///etc/passwd"?
>
>
> А адреса почты или сайтов вообще лучше не проверять. На почту отправить
> письмо, а сайт загрузить. Если письмо не отправилось или сайт не загрузился,
> анализировать возвращаемое функцией значение.
>

Алексей Саскевич

unread,
Jun 23, 2014, 3:59:51 AM6/23/14
to gola...@googlegroups.com
воскресенье, 22 июня 2014 г., 19:20:42 UTC+3 пользователь Антон Агеев написал:
1. Часть функций дублируют стандартную библиотеку (Contains, IsAlpha, etc.). Зачем?
2. Пользы от жестко зашитых паттернов не очень много. В разных задачах приходится валидировать тот же e-mail по разному.
3. Из пункта 2 вытекает то, что непонятны критерии выбора паттернов для валидации. Почему, к примеру, IsURL не считает валидным URL "//google.com/" или "file:///etc/passwd"?

1. Тот же самый IsAlpha - я как-то не заметил, чтобы в стандартных пакетах он был. Да, есть пакет unicode, в нем есть функции IsLetter и IsDigit, но как я увидел из документации, они работают с отдельными символами, а для работы с полной строкой все равно нужно писать отдельную функцию (если я не прав, поправьте). Возможно, эти функции есть и в JS, но тогда возникает тот же вопрос к автору JS-версии, зачем он дублировал их.
2. Паттерны выглядят куда более изящно, чем целая функция. Да и заменить один паттерн гораздо проще, чем переписать целую функцию.
3. Вижу, исправлю, спасибо за недочет.


воскресенье, 22 июня 2014 г., 22:45:06 UTC+3 пользователь Igor Khaziev написал:
А адреса почты или сайтов вообще лучше не проверять. На почту отправить письмо, а сайт загрузить. Если письмо не отправилось или сайт не загрузился, анализировать возвращаемое функцией значение.

Хм, вариант конечно интересный, но как же быть, если, к примеру, отсутствует всякое соединение с Сетью. :)


Во всяком случае спасибо за критику, мне, как начинающему гоферу, есть над чем поразмыслить :)

Игорь Хазиев

unread,
Jun 23, 2014, 2:06:01 PM6/23/14
to gola...@googlegroups.com



23 июня 2014 г., 11:59 пользователь Алексей Саскевич <bwa...@gmail.com> написал:
Хм, вариант конечно интересный, но как же быть, если, к примеру, отсутствует всякое соединение с Сетью. :)

Можно попытаться отправить позже, когда соединение восстановят. Вот ещё агрументы за простую отправку:
1. Сервер может поддерживать почтовые адреса, которые не соответствуют RFC.
2. Адрес может соответствовать RFC, но отсутствовать на сервере.

Konstantin Cherkasoff

unread,
Jun 23, 2014, 5:23:29 PM6/23/14
to gola...@googlegroups.com
> А адреса почты или сайтов вообще лучше не проверять. На почту отправить
> письмо, а сайт загрузить. Если письмо не отправилось или сайт не загрузился,
> анализировать возвращаемое функцией значение.

Ага, а для валидации номера телефона - позвонить на телефон :-)

Разные бывают ситуации. Бывает, надо по файлу из 100500 записей
пройтись и выкинуть явные не-Email и не-URLы.


--
Konstantin Cherkasoff

Алексей Саскевич

unread,
Jul 3, 2014, 11:46:41 AM7/3/14
to gola...@googlegroups.com

Кстати, такой момент. Почему Go не хочет принимать в записи регулярного выражения такой токен : \x{FFF0}, расположенном между двойными кавычками (")?
Вот тут, в коде (строка 120), он есть : http://golang.org/src/pkg/regexp/syntax/regexp.go
Однако тут кавычки одинарные (`). В одинарных кавычках разве не нужно экранировать символ слэша?

Orlovsky Alexander

unread,
Jul 3, 2014, 12:06:09 PM7/3/14
to gola...@googlegroups.com
не хочет восппринимать, потому-что это невалидный юникод

в вашем примере – это не одинарные кавычки (если приглядеться, то видно) а "back quotes"
см. http://golang.org/ref/spec#String_literals



четверг, 3 июля 2014 г., 19:46:41 UTC+4 пользователь Алексей Саскевич написал:

Алексей Саскевич

unread,
Jul 3, 2014, 12:19:08 PM7/3/14
to gola...@googlegroups.com

С точки зрения Perl-синтаксиса регулярок, \x{fff0} вполне себе валидный, хотя, с другой стороны, язык прекрасно поддерживает JS вариант в виде \uFFF0. Отсюда и возникает такой вопрос )

03 июля 2014 г. 19:06 пользователь "Orlovsky Alexander" <nordi...@gmail.com> написал:
--
Вы получили это сообщение, поскольку подписаны на одну из тем в группе "Golang Russian".
Чтобы отменить подписку на эту тему, перейдите по ссылке https://groups.google.com/d/topic/golang-ru/k4iThfgXGyE/unsubscribe.
Чтобы отменить подписку на эту группу и все ее темы, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.

Orlovsky Alexander

unread,
Jul 3, 2014, 1:52:59 PM7/3/14
to gola...@googlegroups.com
Причем тут Perl?

В спеке (Go) написано:

The three-digit octal (\nnn) and two-digit hexadecimal (\xnn) escapes represent individual bytes of the resulting string; all other escapes represent the (possibly multi-byte) UTF-8 encoding of individual characters. Thus inside a string literal \377 and \xFF represent a single byte of value 0xFF=255, while ÿ, \u00FF, \U000000FF and \xc3\xbf represent the two bytes 0xc3 0xbf of the UTF-8 encoding of character U+00FF

+

http://golang.org/pkg/regexp/
The syntax of the regular expressions accepted is the same general syntax used by Perl, Python, and other languages. More precisely, it is the syntax accepted by RE2 and described at http://code.google.com/p/re2/wiki/Syntax

Так-что если хочется матчить что-то регекспами в Go, то, во-первых, надо передать в регексп строку валидную для Go, а, во-вторых, она должна быть корректной с точки зрения движка RE2

приведите пример кода который не работает на play.golang.org


четверг, 3 июля 2014 г., 20:19:08 UTC+4 пользователь Алексей Саскевич написал:
Reply all
Reply to author
Forward
0 new messages