A Ruby port of validator.js — a comprehensive library of string validators and sanitizers for Ruby and Rails.
Validator.js has 23k+ GitHub stars and 18M+ weekly npm downloads. Until now, Ruby had no single gem offering the same API. Use this for API params, form input, background jobs, or any place you need to validate or sanitize strings.
Add to your Gemfile:
gem "string_validator"Then run:
bundle installOr install globally:
gem install string_validatorAll methods are on the StringValidator module. Input must be a String (validator.js is strings-only too).
Return true or false.
require "string_validator"
StringValidator.is_email?("foo@bar.com") # => true
StringValidator.is_email?("invalid") # => false
StringValidator.is_url?("https://example.com") # => true
StringValidator.is_url?("not a url") # => false
StringValidator.is_ip?("192.168.1.1") # => true
StringValidator.is_ip?("::1", version: 6) # => true
StringValidator.is_empty?(" ") # => false
StringValidator.is_empty?(" ", ignore_whitespace: true) # => true
StringValidator.is_length?("hello", min: 1, max: 10) # => true
StringValidator.is_alpha?("abc") # => true
StringValidator.is_alphanumeric?("user123") # => true
StringValidator.is_numeric?("42.5") # => true
StringValidator.is_int?("42", min: 0, max: 100) # => true
StringValidator.is_float?("3.14") # => true
StringValidator.is_boolean?("true") # => true
StringValidator.is_boolean?("yes", loose: true) # => true
StringValidator.is_json?('{"a":1}') # => true
StringValidator.is_base64?("SGVsbG8=") # => true
StringValidator.is_hex_color?("#ff0000") # => true
StringValidator.is_uuid?("550e8400-e29b-41d4-a716-446655440000") # => true
StringValidator.is_ascii?("Hello") # => true
StringValidator.is_slug?("my-post-title") # => true
StringValidator.is_mac_address?("01:02:03:04:05:ab") # => true
StringValidator.is_credit_card?("4111111111111111") # => true (Luhn check)
StringValidator.is_md5?("d41d8cd98f00b204e9800998ecf8427e") # => true
StringValidator.is_hexadecimal?("0a1f") # => true
StringValidator.is_port?("443") # => true
StringValidator.is_iso8601?("2024-01-15") # => true
StringValidator.is_date?("2024-01-15") # => true
StringValidator.is_data_uri?("data:image/png;base64,...") # => true
StringValidator.is_sem_ver?("1.2.3") # => true
StringValidator.is_mongo_id?("507f1f77bcf86cd799439011") # => true
StringValidator.is_iban?("GB82WEST12345698765432") # => true (optional locale: "GB")
StringValidator.is_postal_code?("12345", locale: "US") # => true (US, GB, CA, DE, IN, etc.)
StringValidator.is_jwt?("eyJhbGc...") # => true (structure only; no signature check)
StringValidator.contains?("hello world", "world") # => true
StringValidator.equals?("foo", "foo") # => true
StringValidator.is_in?("red", %w[red green blue]) # => trueReturn a transformed string (or the original if not a string).
StringValidator.escape("<script>alert('x')</script>")
# => "<script>alert('x')</script>"
StringValidator.trim(" hello ") # => "hello"
StringValidator.blacklist("hello world", "ol") # => "he wrd"
StringValidator.whitelist("abc123", "0123456789") # => "123"
StringValidator.whitelist("abc123", "a-c0-9") # => "abc123"
StringValidator.strip_low("hello\x00world") # => "helloworld"
StringValidator.to_boolean("true") # => true
StringValidator.to_boolean("false") # => false
StringValidator.to_boolean("yes", strict: false) # => true
StringValidator.to_int("42") # => 42
StringValidator.to_float("3.14") # => 3.14
StringValidator.normalize_email(" User@Example.COM ") # => "user@example.com"
StringValidator.unescape("<tag>") # => "<tag>"Use in custom validators or in models:
# app/validators/email_validator.rb
class EmailValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
return if value.blank?
unless StringValidator.is_email?(value.to_s)
record.errors.add(attribute, options[:message] || "is not a valid email")
end
end
endOr inline:
validate :email_format
def email_format
return if email.blank?
errors.add(:email, "invalid") unless StringValidator.is_email?(email)
endvalid? enforces that the first argument is a String and that the validator name exists:
StringValidator.valid?("user@example.com", :is_email?) # => true
StringValidator.valid?(nil, :is_email?) # => raises NotStringError
StringValidator.valid?("x", :not_a_validator) # => raises InvalidValidatorErrorError classes (all inherit from StringValidator::Error):
StringValidator::NotStringError— input tovalid?is not a StringStringValidator::InvalidValidatorError— unknown validator name passed tovalid?
Robustness: Validators return false (and sanitizers return the original value) when given non-strings, nil where it would cause errors, or when parsing/encoding fails, so you can pass user input safely without rescuing.
Ruby 3.0+.
MIT. See LICENSE.
API and behavior are inspired by validator.js (MIT). This gem is an independent Ruby implementation for the Ruby community.