PHPackages                             horizom/validation - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Validation &amp; Sanitization](/categories/validation)
4. /
5. horizom/validation

ActiveLibrary[Validation &amp; Sanitization](/categories/validation)

horizom/validation
==================

A fast, extensible &amp; stand-alone PHP input validation class that allows you to validate any data.

3.1.0(3y ago)1214MITPHPPHP ^8.0

Since Jun 16Pushed 3y ago1 watchersCompare

[ Source](https://github.com/horizom/validation)[ Packagist](https://packagist.org/packages/horizom/validation)[ Docs](https://horizom.github.io)[ RSS](/packages/horizom-validation/feed)WikiDiscussions master Synced today

READMEChangelog (6)DependenciesVersions (7)Used By (0)

[![](https://camo.githubusercontent.com/62380dbb63cdb97c3cb0d517f9a7b32b85320f06b0671ec5be2d3be4d9b16b01/68747470733a2f2f686f72697a6f6d2e6769746875622e696f2f696d672f686f72697a6f6d2d6c6f676f2d636f6c6f722e737667)](https://camo.githubusercontent.com/62380dbb63cdb97c3cb0d517f9a7b32b85320f06b0671ec5be2d3be4d9b16b01/68747470733a2f2f686f72697a6f6d2e6769746875622e696f2f696d672f686f72697a6f6d2d6c6f676f2d636f6c6f722e737667)

[![Latest Stable Version](https://camo.githubusercontent.com/40d05b54b820b6aff78d505a700a8d4f99eebe70ce94109f0ee77113dc387e9b/68747470733a2f2f706f7365722e707567782e6f72672f686f72697a6f6d2f76616c69646174696f6e2f762f737461626c652e737667)](https://packagist.org/packages/horizom/validation)[![Total Downloads](https://camo.githubusercontent.com/75ff4a04558317f85d83b891b4f700ded4d6db4d71f470cc5358dc00b8900f4d/68747470733a2f2f706f7365722e707567782e6f72672f686f72697a6f6d2f76616c69646174696f6e2f642f746f74616c2e737667)](https://packagist.org/packages/horizom/validation)[![License](https://camo.githubusercontent.com/3e0282f1484bc33b6556f91c8dedae065fb5b9529325cb84e669ea36c8357fc2/68747470733a2f2f706f7365722e707567782e6f72672f686f72697a6f6d2f76616c69646174696f6e2f6c6963656e73652e737667)](https://packagist.org/packages/horizom/validation)

Horizom Validation
==================

[](#horizom-validation)

Focked from [GUMP](https://github.com/Wixel/GUMP), Horizom Validation is a standalone PHP data validation and filtering class that makes validating any data easy and painless without the reliance on a framework. Horizom Validation is open-source.

#### Install with composer

[](#install-with-composer)

```
composer require horizom/validation

```

### Short format example for validations

[](#short-format-example-for-validations)

```
$is_valid = Horizom\Validation::isValid(array_merge($_POST, $_FILES), [
    'username'       => 'required|alpha_numeric',
    'password'       => 'required|between_len,4;100',
    'avatar'         => 'required_file|extension,png;jpg',
    'tags'           => 'required|alpha_numeric', // ['value1', 'value3']
    'person.name'    => 'required',               // ['person' => ['name' => 'value']]
    'persons.*.age'  => 'required'                // ['persons' => [
                                                  //      ['name' => 'value1', 'age' => 20],
                                                  //      ['name' => 'value2']
                                                  // ]]
]);

// 1st array is rules definition, 2nd is field-rule specific error messages (optional)
$is_valid = Horizom\Validation::isValid(array_merge($_POST, $_FILES), [
    'username' => ['required', 'alpha_numeric'],
    'password' => ['required', 'between_len' => [6, 100]],
    'avatar'   => ['required_file', 'extension' => ['png', 'jpg']]
], [
    'username' => ['required' => 'Fill the Username field please.'],
    'password' => ['between_len' => '{field} must be between {param[0]} and {param[1]} characters.'],
    'avatar'   => ['extension' => 'Valid extensions for avatar are: {param}'] // "png, jpg"
]);

if ($is_valid === true) {
    // continue
} else {
    var_dump($is_valid); // array of error messages
}
```

### Short format example for filtering

[](#short-format-example-for-filtering)

```
$filtered = Horizom\Validation::filterInput([
    'field'       => ' text ',
    'other_field' => 'Cool Title'
], [
    'field'       => ['trim', 'upper_case'],
    'other_field' => 'slug'
]);

var_dump($filtered['field']); // result: "TEXT"
var_dump($filtered['other_field']); // result: "cool-title"
```

### Long format example

[](#long-format-example)

```
$validation = new Horizom\Validation();

// set validation rules
$validation->rules([
    'username'    => 'required|alpha_numeric|max_len,100|min_len,6',
    'password'    => 'required|max_len,100|min_len,6',
    'email'       => 'required|valid_email',
    'gender'      => 'required|exact_len,1|contains,m;f',
    'credit_card' => 'required|valid_cc'
]);

// set field-rule specific error messages
$validation->messages([
    'username'      => ['required' => 'Fill the Username field please, its required.'],
    'credit_card'   => ['extension' => 'Please enter a valid credit card.']
]);

// set filter rules
$validation->filters([
    'username' => 'trim|sanitize_string',
    'password' => 'trim',
    'email'    => 'trim|sanitize_email',
    'gender'   => 'trim',
    'bio'      => 'noise_words'
]);

// on success: returns array with same input structure, but after filters have run
// on error: returns false
$validData = $validation->run($_POST);

if ($validation->errors()) {
    var_dump($validation->getReadableErrors()); // ['Field Somefield is required.']
    // or
    var_dump($validation->getErrors()); // ['field' => 'Field Somefield is required']
} else {
    var_dump($validData);
}
```

⭐ Available Validators
----------------------

[](#star-available-validators)

**Important:** If you use Pipe or Semicolon as parameter value, you **must** use array format.

```
$is_valid = Horizom\Validation::isValid(array_merge($_POST, $_FILES), [
    'field' => 'regex,/partOf;my|Regex/', // NO
    'field' => ['regex' => '/partOf;my|Regex/'] // YES
]);
```

RuleDescription**required**Ensures the specified key value exists and is not empty (not null, not empty string, not empty array).**contains**,one;two;use array format if one of the values contains semicolonsVerify that a value is contained within the pre-defined value set.**contains\_list**,value1;value2Verify that a value is contained within the pre-defined value set. Error message will NOT show the list of possible values.**doesnt\_contain\_list**,value1;value2Verify that a value is contained within the pre-defined value set. Error message will NOT show the list of possible values.**boolean**,strictDetermine if the provided value is a valid boolean. Returns true for: yes/no, on/off, 1/0, true/false. In strict mode (optional) only true/false will be valid which you can combine with boolean filter.**valid\_email**Determine if the provided email has valid format.**max\_len**,240Determine if the provided value length is less or equal to a specific value.**min\_len**,4Determine if the provided value length is more or equal to a specific value.**exact\_len**,5Determine if the provided value length matches a specific value.**between\_len**,3;11Determine if the provided value length is between min and max values.**alpha**Determine if the provided value contains only alpha characters.**alpha\_numeric**Determine if the provided value contains only alpha-numeric characters.**alpha\_dash**Determine if the provided value contains only alpha characters with dashed and underscores.**alpha\_numeric\_dash**Determine if the provided value contains only alpha numeric characters with dashed and underscores.**alpha\_numeric\_space**Determine if the provided value contains only alpha numeric characters with spaces.**alpha\_space**Determine if the provided value contains only alpha characters with spaces.**numeric**Determine if the provided value is a valid number or numeric string.**integer**Determine if the provided value is a valid integer.**float**Determine if the provided value is a valid float.**valid\_url**Determine if the provided value is a valid URL.**url\_exists**Determine if a URL exists &amp; is accessible.**valid\_ip**Determine if the provided value is a valid IP address.**valid\_ipv4**Determine if the provided value is a valid IPv4 address.**valid\_ipv6**Determine if the provided value is a valid IPv6 address.**valid\_cc**Determine if the input is a valid credit card number.**valid\_name**Determine if the input is a valid human name.**street\_address**Determine if the provided input is likely to be a street address using weak detection.**iban**Determine if the provided value is a valid IBAN.**date**,d/m/YDetermine if the provided input is a valid date (ISO 8601) or specify a custom format (optional).**min\_age**,18Determine if the provided input meets age requirement (ISO 8601). Input should be a date (Y-m-d).**max\_numeric**,50Determine if the provided numeric value is lower or equal to a specific value.**min\_numeric**,1Determine if the provided numeric value is higher or equal to a specific value.**starts**,ZDetermine if the provided value starts with param.**required\_file**Determine if the file was successfully uploaded.**extension**,png;jpg;gifCheck the uploaded file for extension. Doesn't check mime-type yet.**equalsfield**,other\_field\_nameDetermine if the provided field value equals current field value.**guidv4**Determine if the provided field value is a valid GUID (v4)**phone\_number**Determine if the provided value is a valid phone number.**regex**,/test-\[0-9\]{3}/Custom regex validator.**valid\_json\_string**Determine if the provided value is a valid JSON string.**valid\_array\_size\_greater**,1Check if an input is an array and if the size is more or equal to a specific value.**valid\_array\_size\_lesser**,1Check if an input is an array and if the size is less or equal to a specific value.**valid\_array\_size\_equal**,1Check if an input is an array and if the size is equal to a specific value.**valid\_twitter**Determine if the provided value is a valid Twitter account.

⭐ Available Filters
-------------------

[](#star-available-filters)

Filter rules can also be any PHP native function (e.g.: trim).

FilterDescription**noise\_words**Replace noise words in a string ([http://tax.cchgroup.com/help/Avoiding\_noise\_words\_in\_your\_search.htm](http://tax.cchgroup.com/help/Avoiding_noise_words_in_your_search.htm)).**rmpunctuation**Remove all known punctuation from a string.**urlencode**Sanitize the string by urlencoding characters.**htmlencode**Sanitize the string by converting HTML characters to their HTML entities.**sanitize\_email**Sanitize the string by removing illegal characters from emails.**sanitize\_numbers**Sanitize the string by removing illegal characters from numbers.**sanitize\_floats**Sanitize the string by removing illegal characters from float numbers.**sanitize\_string**Sanitize the string by removing any script tags.**boolean**Converts \['1', 1, 'true', true, 'yes', 'on'\] to true, anything else is false ('on' is useful for form checkboxes).**basic\_tags**Filter out all HTML tags except the defined basic tags.**whole\_number**Convert the provided numeric value to a whole number.**ms\_word\_characters**Convert MS Word special characters to web safe characters. (\[“ ”\] =&gt; ", \[‘ ’\] =&gt; ', \[–\] =&gt; -, \[…\] =&gt; ...)**lower\_case**Converts to lowercase.**upper\_case**Converts to uppercase.**slug**Converts value to url-web-slugs.**trim**Remove spaces from the beginning and end of strings (PHP).

#### Other Available Methods

[](#other-available-methods)

```
/**
 * This is the most flexible validation "executer" because of it's return errors format.
 *
 * Returns bool true when no errors.
 * Returns array of errors with detailed info. which you can then use with your own helpers.
 * (field name, input value, rule that failed and it's parameters).
 */
$validation->validate(array $input, array $ruleset);

/**
 * Filters input data according to the provided filterset
 *
 * Returns array with same input structure but after filters have been applied.
 */
$validation->filter(array $input, array $filterset);

// Sanitizes data and converts strings to UTF-8 (if available), optionally according to the provided field whitelist
$validation->sanitize(array $input, $whitelist = null);

// Override field names in error messages
Horizom\Validation::setFieldName('str', 'Street');
Horizom\Validation::setFieldNames([
    'str' => 'Street',
    'zip' => 'ZIP Code'
]);

// Set custom error messages for rules.
Horizom\Validation::setErrorMessage('required', '{field} is required.');
Horizom\Validation::setErrorMessages([
    'required'    => '{field} is required.',
    'valid_email' => '{field} must be a valid email.'
]);

// Strips and encodes unwanted characters
Horizom\Validation::xssClean(array $data);
```

### Creating your own validators and filters

[](#creating-your-own-validators-and-filters)

Adding custom validators and filters is made easy by using callback functions.

```
/**
 * You would call it like 'equals_string,someString'
 *
 * @param string $field  Field name
 * @param array  $input  Whole input data
 * @param array  $params Rule parameters. This is usually empty array by default if rule does not have parameters.
 * @param mixed  $value  Value.
 *                       In case of an array ['value1', 'value2'] would return one single value.
 *                       If you want to get the array itself use $input[$field].
 *
 * @return bool   true or false whether the validation was successful or not
 */
Horizom\Validation::addValidator("equals_string", function($field, array $input, array $params, $value) {
    return $value === $params;
}, 'Field {field} does not equal to {param}.');

/**
 * @param string $value Value
 * @param array  $param Filter parameters (optional)
 *
 * @return mixed  result of filtered value
 */
Horizom\Validation::addFilter("upper", function($value, array $params = []) {
    return strtoupper($value);
});
```

Alternately, you can simply create your own class that extends `Horizom\Validation`. You only have to have in mind:

- For filter methods, prepend the method name with "filter\_".
- For validator methods, prepend the method name with "validate\_".

```
class MyClass extends Horizom\Validation
{
    protected function filter_myfilter($value, array $params = [])
    {
        return strtoupper($value);
    }

    protected function validate_myvalidator($field, array $input, array $params = [], $value)
    {
        return $input[$field] === 'good_value';
    }
}

$validator = new MyClass();
$validated = $validator->validate($_POST, $rules);
```

Global configuration
--------------------

[](#global-configuration)

This configuration values allows you to change default rules delimiters (e.g.: `required|contains,value1;value2` to `required|contains:value1,value2`).

```
Horizom\Validation::$rules_delimiter = '|';

Horizom\Validation::$rules_parameters_delimiter = ',';

Horizom\Validation::$rules_parameters_arrays_delimiter = ';';
```

###  Health Score

27

—

LowBetter than 47% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity13

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity58

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~5 days

Total

6

Last Release

1454d ago

Major Versions

1.1.2 → 3.0.02022-07-10

PHP version history (2 changes)1.0.0PHP &gt;=7.0

3.0.0PHP ^8.0

### Community

Maintainers

![](https://www.gravatar.com/avatar/412f8e786e65f078584b4bc2c0b7a44af095ab2c0d19a5fb7985598576ca4fda?d=identicon)[lambirou](/maintainers/lambirou)

---

Top Contributors

[![lambirou](https://avatars.githubusercontent.com/u/1428556?v=4)](https://github.com/lambirou "lambirou (8 commits)")

---

Tags

validatorvalidationvalidate

### Embed Badge

![Health badge](/badges/horizom-validation/health.svg)

```
[![Health](https://phpackages.com/badges/horizom-validation/health.svg)](https://phpackages.com/packages/horizom-validation)
```

###  Alternatives

[respect/validation

The most awesome validation engine ever created for PHP

6.0k39.9M415](/packages/respect-validation)[wixel/gump

A fast, extensible &amp; stand-alone PHP input validation class that allows you to validate any data.

1.2k1.4M32](/packages/wixel-gump)[opis/json-schema

Json Schema Validator for PHP

65243.6M302](/packages/opis-json-schema)[sadegh19b/laravel-persian-validation

A comprehensive Laravel validation package for Persian text, numbers, dates, and Iranian national identifiers

18598.1k1](/packages/sadegh19b-laravel-persian-validation)[awurth/slim-validation

A wrapper around the respect/validation PHP validation library for easier error handling and display

65399.7k9](/packages/awurth-slim-validation)[romeoz/rock-validate

Flexible validator for PHP with I18N.

251.7k6](/packages/romeoz-rock-validate)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
