PHPackages                             fallahalireza/persian-tools-laravel - 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. fallahalireza/persian-tools-laravel

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

fallahalireza/persian-tools-laravel
===================================

A powerful Laravel package for Persian text utilities, Iranian validation rules, banking tools, national identifiers, Jalali dates, and more.

v1.0.1(2mo ago)142[1 PRs](https://github.com/fallahalireza/persian-tools-laravel/pulls)MITPHPPHP ^8.2CI passing

Since May 25Pushed 1mo agoCompare

[ Source](https://github.com/fallahalireza/persian-tools-laravel)[ Packagist](https://packagist.org/packages/fallahalireza/persian-tools-laravel)[ GitHub Sponsors](https://github.com/:vendor_name)[ RSS](/packages/fallahalireza-persian-tools-laravel/feed)WikiDiscussions main Synced 3w ago

READMEChangelogDependencies (9)Versions (5)Used By (0)

🇮🇷 Persian Tools for Laravel
============================

[](#-persian-tools-for-laravel)

 A powerful Laravel validation package for Persian/Iranian applications including national IDs, banking, mobile numbers, license plates, Jalali dates and more.

 یک پکیج قدرتمند و جامع لاراول برای اعتبارسنجی متن فارسی، شناسه‌های ایرانی، بانکداری، تاریخ شمسی، پلاک خودرو و بیشتر

 [ ![PHP Version](https://camo.githubusercontent.com/f2a8ce481f9787833e7d3330d6cdf3f1494f984301cbeaf6bc14fcfc34efc316/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d253345253344382e322d626c7565) ](https://php.net) [ ![Laravel](https://camo.githubusercontent.com/0cdfcc65f0181c9cd2e67088b9ce598eb43f864133491392674b90249c58848e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c61726176656c2d3131253243313225324331332d726564) ](https://laravel.com) [ ![Latest Version](https://camo.githubusercontent.com/d91f535b9c822ba2283d503722454f99bd3869ad34fa46f29cfadd2c9913c620/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f66616c6c6168616c6972657a612f7065727369616e2d746f6f6c732d6c61726176656c) ](https://packagist.org/packages/fallahalireza/persian-tools-laravel) [ ![License](https://camo.githubusercontent.com/5caa455d8debc46fb23abbadb45a733a937f3910a73fc875c2f7820468e1bb54/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d677265656e) ](LICENSE)

---

### 🌍 Language / زبان

[](#-language--زبان)

 [ ![](https://camo.githubusercontent.com/5c5619355f6b3d31977607b879b5b71b677c0606b376d2a1db3ba502cdc74a6d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f456e676c6973682d446f63756d656e746174696f6e2d626c75653f7374796c653d666f722d7468652d6261646765266c6f676f3d72656164746865646f6373) ](#-english-documentation) [ ![](https://camo.githubusercontent.com/96c82d25b53c5138eb3d40e39279ee72cebe485397d35601fa7ed1fb0e4357ea/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5065727369616e2d446f63756d656e746174696f6e2d7265643f7374796c653d666f722d7468652d6261646765266c6f676f3d72656164746865646f6373) ](#-مستندات-فارسی)

---

---

🇬🇧 English Documentation
========================

[](#-english-documentation)

Table of Contents
-----------------

[](#table-of-contents)

- [Features](#-features)
- [Requirements](#-requirements)
- [Installation](#-installation)
- [Configuration](#%EF%B8%8F-configuration)
- [Usage](#-usage)
- [Validation Rules Reference](#-all-validation-rules)
    - [Persian Text &amp; Numbers](#-persian-text--numbers)
    - [Persian Dates](#-persian-dates)
    - [Phone Numbers](#-phone-numbers)
    - [Identifiers](#-identifiers)
    - [Banking](#-banking)
    - [Other](#-other)
- [Enums Reference](#-enums-reference)
- [Localization](#-localization)
- [Testing](#-testing)
- [Contributing](#-contributing)
- [License](#-license)

---

✨ Features
----------

[](#-features)

This package provides a **rich set of Laravel validation rules** tailored for Persian/Iranian applications. Below is a quick comparison with other available packages:

FeatureThis PackageOthersکد اقتصادی (Economic Code) validation✅❌پلاک خودرو (License Plate) validation✅❌شماره حساب بانکی (Bank Account Number)✅❌Bank detection from card BIN✅❌Type-safe `PersianRule` Enum✅❌`MobileFormat` Enum✅❌Luhn algorithm for bank cards✅✅Full IBAN (Sheba) checksum✅✅National ID checksum✅✅Persian digit normalization✅partialBilingual error messages (fa/en)✅partial---

📋 Requirements
--------------

[](#-requirements)

DependencyVersionPHP`^8.2`Laravel`^11.0`, `^12.0`, or `^13.0`---

📦 Installation
--------------

[](#-installation)

Install via Composer:

```
composer require fallahalireza/persian-tools-laravel
```

The package registers itself automatically via Laravel's package auto-discovery — no manual provider registration is needed.

### Publish Config (Optional)

[](#publish-config-optional)

```
php artisan vendor:publish --tag="persian-tools-config"
```

### Publish Language Files (Optional)

[](#publish-language-files-optional)

```
php artisan vendor:publish --tag="persian-tools-lang"
```

---

⚙️ Configuration
----------------

[](#️-configuration)

After publishing, edit `config/persian-tools.php`:

```
return [
    /*
    |--------------------------------------------------------------------------
    | Register Rules as Laravel Validator Strings
    |--------------------------------------------------------------------------
    | When enabled, rules like 'ir_national_id', 'persian_alpha', etc.
    | can be used as strings in $rules arrays.
    */
    'register_rules' => true,

    /*
    |--------------------------------------------------------------------------
    | Accept Persian Digits Globally
    |--------------------------------------------------------------------------
    | When enabled, Persian numerals (۰-۹) are automatically converted
    | to their ASCII equivalents before validation.
    */
    'accept_persian_numbers' => false,
];
```

---

🚀 Usage
-------

[](#-usage)

There are **three ways** to use this package:

### 1. String-based Rules (requires `register_rules = true`)

[](#1-string-based-rules-requires-register_rules--true)

The simplest approach — use rule names as strings:

```
$request->validate([
    'name'        => 'required|persian_alpha',
    'mobile'      => 'required|ir_mobile',
    'national_id' => 'required|ir_national_id',
    'birth_date'  => 'required|persian_date',
    'card_number' => 'required|ir_bank_card',
    'plate'       => 'required|ir_license_plate',
    'eco_code'    => 'required|ir_economic_code',
    'sheba'       => 'required|ir_iban',
    'postal_code' => 'required|ir_postal_code',
]);
```

### 2. Class-based Rules (always available)

[](#2-class-based-rules-always-available)

Use rule classes directly for full control over parameters:

```
use FallahAlireza\PersianTools\Rules\PersianAlpha;
use FallahAlireza\PersianTools\Rules\IranianNationalId;
use FallahAlireza\PersianTools\Rules\IranianMobile;
use FallahAlireza\PersianTools\Rules\IranianBankCardNumber;
use FallahAlireza\PersianTools\Rules\IranianPhone;
use FallahAlireza\PersianTools\Rules\IranianLicensePlate;
use FallahAlireza\PersianTools\Enums\MobileFormat;

$request->validate([
    'name'   => ['required', new PersianAlpha],
    'mobile' => ['required', new IranianMobile(format: MobileFormat::Zero)],
    'card'   => ['required', new IranianBankCardNumber(separator: '-')],
    'phone'  => ['required', new IranianPhone(withAreaCode: true, areaCodeSeparator: '-')],
    'plate'  => ['required', new IranianLicensePlate(allowMotorcycle: true)],
]);
```

### 3. Type-safe Enum (always available)

[](#3-type-safe-enum-always-available)

Leverage the `PersianRule` enum to avoid typos in rule names:

```
use FallahAlireza\PersianTools\Enums\PersianRule;

$request->validate([
    'name'        => ['required', PersianRule::PersianAlpha->value],
    'mobile'      => ['required', PersianRule::IranianMobile->value],
    'national_id' => ['required', PersianRule::IranianNationalId->value],
]);
```

---

📋 All Validation Rules
----------------------

[](#-all-validation-rules)

### 🔤 Persian Text &amp; Numbers

[](#-persian-text--numbers)

String RuleClassDescriptionValid ExampleInvalid Example`persian_alpha``PersianAlpha`Persian letters, punctuation &amp; spaces`سلام علی‌رضا``Hello``persian_alpha_num``PersianAlphaNum`Persian letters + Persian digits`سلام۱۲۳``Hello 123``persian_alpha_eng_num``PersianAlphaEngNum`Persian letters + Persian/English digits`سلام123``Hello``persian_num``PersianNum`Persian digits only`۱۲۳۴۵``12345``persian_not_accept``PersianNotAccept`Reject any Persian content`Hello 123``سلام`---

### 📅 Persian Dates

[](#-persian-dates)

String RuleParametersDescription`persian_date``separator`, `convertPersianNumbers`Valid Jalali (Shamsi) date`persian_date_between``startDate`, `endDate`, `separator`, `convertPersianNumbers`Date within a range (exclusive)`persian_month`—Valid Persian month name`persian_day`—Valid Persian day of week name**Examples:**

```
use FallahAlireza\PersianTools\Rules\PersianDate;
use FallahAlireza\PersianTools\Rules\PersianDateBetween;

// Default separator is '/'  →  e.g. 1403/06/31
new PersianDate()

// Custom separator
new PersianDate(separator: '-')  // e.g. 1403-06-31

// Accept Persian digits like ۱۴۰۳/۰۶/۳۱
new PersianDate(convertPersianNumbers: true)

// Validate date between two dates (not inclusive)
new PersianDateBetween('1400/01/01', '1403/12/29')
```

---

### 📱 Phone Numbers

[](#-phone-numbers)

String RuleClassParametersValid Examples`ir_mobile``IranianMobile``format`, `convertPersianNumbers``09123456789`, `+989123456789``ir_phone``IranianPhone``withAreaCode`, `areaCodeSeparator`, `withCountryCodeFormat`, `convertPersianNumbers``02112345678``ir_phone_area_code``IranianPhoneAreaCode``convertPersianNumbers``021`, `031`, `044`**Mobile Format options:**

```
use FallahAlireza\PersianTools\Rules\IranianMobile;
use FallahAlireza\PersianTools\Enums\MobileFormat;

new IranianMobile(format: MobileFormat::All)       // any format (default)
new IranianMobile(format: MobileFormat::Zero)      // 09xxxxxxxxx only
new IranianMobile(format: MobileFormat::PlusCode)  // +98xxxxxxxxx only
new IranianMobile(format: MobileFormat::ZeroCode)  // 0098xxxxxxxxx only
new IranianMobile(format: MobileFormat::Code)      // 98xxxxxxxxx only
new IranianMobile(format: MobileFormat::Normal)    // 9xxxxxxxxx only
```

**Phone with area code:**

```
use FallahAlireza\PersianTools\Rules\IranianPhone;

new IranianPhone(withAreaCode: true)                              // 02112345678
new IranianPhone(withAreaCode: true, areaCodeSeparator: '-')      // 021-12345678
new IranianPhone(withAreaCode: false)                             // 12345678 (no area code)
```

---

### 🪪 Identifiers

[](#-identifiers)

String RuleClassDescriptionValid Example`ir_national_id``IranianNationalId`10-digit National ID with checksum`0013542419``ir_company_id``IranianCompanyId`Legal Entity National ID (شناسه ملی اشخاص حقوقی)`14007650912``ir_economic_code``IranianEconomicCode`14-digit Economic Code (کد اقتصادی) ⭐`14004800101010`---

### 🏦 Banking

[](#-banking)

String RuleClassDescription`ir_bank_card``IranianBankCardNumber`16-digit bank card (Luhn algorithm + BIN detection)`ir_iban``IranianIban`IBAN / Sheba number with full checksum validation`ir_bank_account``IranianBankAccountNumber`Bank account number ⭐**Advanced banking usage:**

```
use FallahAlireza\PersianTools\Rules\IranianBankCardNumber;
use FallahAlireza\PersianTools\Rules\IranianIban;

// Detect bank name from card number
$rule = new IranianBankCardNumber();
$bank = $rule->detectBank('6037991234567890');
// Returns: "بانک ملی ایران"

// Accept card with dash separator: 6037-9912-3456-7890
new IranianBankCardNumber(separator: '-')

// IBAN without 'IR' prefix
new IranianIban(withPrefix: false)

// IBAN with 'IR' prefix (default)
new IranianIban(withPrefix: true)
```

---

### 📍 Other

[](#-other)

String RuleClassParametersDescription`ir_postal_code``IranianPostalCode``separator`10-digit Iranian postal code`ir_license_plate``IranianLicensePlate``allowMotorcycle`Car &amp; motorcycle license plate ⭐**Examples:**

```
use FallahAlireza\PersianTools\Rules\IranianLicensePlate;
use FallahAlireza\PersianTools\Rules\IranianPostalCode;

// Standard car plate only: e.g. 12الف34567
new IranianLicensePlate()

// Also accept motorcycle plates: e.g. 123456789
new IranianLicensePlate(allowMotorcycle: true)

// Postal code without separator: 1234567890
new IranianPostalCode()

// Postal code with separator: 12345-67890
new IranianPostalCode(separator: '-')
```

---

🔢 Enums Reference
-----------------

[](#-enums-reference)

### `PersianRule` Enum

[](#persianrule-enum)

Type-safe enum mapping all rule names:

```
use FallahAlireza\PersianTools\Enums\PersianRule;

PersianRule::PersianAlpha->value        // 'persian_alpha'
PersianRule::PersianAlphaNum->value     // 'persian_alpha_num'
PersianRule::PersianNum->value          // 'persian_num'
PersianRule::PersianNotAccept->value    // 'persian_not_accept'
PersianRule::IranianMobile->value       // 'ir_mobile'
PersianRule::IranianPhone->value        // 'ir_phone'
PersianRule::IranianNationalId->value   // 'ir_national_id'
PersianRule::IranianCompanyId->value    // 'ir_company_id'
PersianRule::IranianEconomicCode->value // 'ir_economic_code'
PersianRule::IranianBankCard->value     // 'ir_bank_card'
PersianRule::IranianIban->value         // 'ir_iban'
PersianRule::IranianBankAccount->value  // 'ir_bank_account'
PersianRule::IranianPostalCode->value   // 'ir_postal_code'
PersianRule::IranianLicensePlate->value // 'ir_license_plate'
PersianRule::PersianDate->value         // 'persian_date'
PersianRule::PersianMonth->value        // 'persian_month'
PersianRule::PersianDay->value          // 'persian_day'
```

### `MobileFormat` Enum

[](#mobileformat-enum)

```
use FallahAlireza\PersianTools\Enums\MobileFormat;

MobileFormat::All       // Any format (default)
MobileFormat::Zero      // Starting with 0: 09...
MobileFormat::PlusCode  // Starting with +98: +989...
MobileFormat::ZeroCode  // Starting with 0098: 00989...
MobileFormat::Code      // Starting with 98: 989...
MobileFormat::Normal    // Starting with 9: 9...
```

---

🌐 Localization
--------------

[](#-localization)

The package ships with **Persian (fa)** and **English (en)** error messages.

Set the default locale in `config/app.php`:

```
'locale' => 'fa', // or 'en'
```

Override per request:

```
app()->setLocale('fa');
```

To customize messages, publish the language files and edit:

```
lang/
  fa/persian-tools.php
  en/persian-tools.php

```

---

🧪 Testing
---------

[](#-testing)

```
composer test
```

Run with coverage:

```
composer test-coverage
```

Run static analysis:

```
composer analyse
```

Format code:

```
composer format
```

---

🤝 Contributing
--------------

[](#-contributing)

Contributions are welcome! Please follow these steps:

1. Fork the repository
2. Create a feature branch: `git checkout -b feature/my-feature`
3. Commit your changes: `git commit -m 'Add my feature'`
4. Push to the branch: `git push origin feature/my-feature`
5. Open a Pull Request

Please make sure all tests pass and code follows PSR-12 standards before submitting.

---

📄 License
---------

[](#-license)

The MIT License (MIT). See [LICENSE](LICENSE) for more information.

**Developed with ❤️ by [Alireza Fallah](https://github.com/fallahalireza)**

---

---

🇮🇷 مستندات فارسی
================

[](#-مستندات-فارسی)

فهرست مطالب
-----------

[](#فهرست-مطالب)

- [ویژگی‌ها](#-%D9%88%DB%8C%DA%98%DA%AF%DB%8C%D9%87%D8%A7)
- [پیش‌نیازها](#-%D9%BE%DB%8C%D8%B4%D9%86%DB%8C%D8%A7%D8%B2%D9%87%D8%A7)
- [نصب](#-%D9%86%D8%B5%D8%A8)
- [پیکربندی](#%EF%B8%8F-%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C)
- [نحوه استفاده](#-%D9%86%D8%AD%D9%88%D9%87-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87)
- [مرجع قوانین اعتبارسنجی](#-%D8%AA%D9%85%D8%A7%D9%85-%D9%82%D9%88%D8%A7%D9%86%DB%8C%D9%86-%D8%A7%D8%B9%D8%AA%D8%A8%D8%A7%D8%B1%D8%B3%D9%86%D8%AC%DB%8C)
    - [متن و اعداد فارسی](#-%D9%85%D8%AA%D9%86-%D9%88-%D8%A7%D8%B9%D8%AF%D8%A7%D8%AF-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C)
    - [تاریخ شمسی](#-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D8%B4%D9%85%D8%B3%DB%8C)
    - [شماره تلفن](#-%D8%B4%D9%85%D8%A7%D8%B1%D9%87-%D8%AA%D9%84%D9%81%D9%86)
    - [شناسه‌ها](#-%D8%B4%D9%86%D8%A7%D8%B3%D9%87%D9%87%D8%A7)
    - [بانکداری](#-%D8%A8%D8%A7%D9%86%DA%A9%D8%AF%D8%A7%D8%B1%DB%8C)
    - [سایر](#-%D8%B3%D8%A7%DB%8C%D8%B1)
- [مرجع Enum‌ها](#-%D9%85%D8%B1%D8%AC%D8%B9-enum%D9%87%D8%A7)
- [بومی‌سازی](#-%D8%A8%D9%88%D9%85%DB%8C%D8%B3%D8%A7%D8%B2%DB%8C)
- [تست‌ها](#-%D8%AA%D8%B3%D8%AA%D9%87%D8%A7)
- [مشارکت](#-%D9%85%D8%B4%D8%A7%D8%B1%DA%A9%D8%AA)
- [مجوز](#-%D9%85%D8%AC%D9%88%D8%B2)

---

✨ ویژگی‌ها
----------

[](#-ویژگی‌ها)

این پکیج مجموعه‌ای غنی از **قوانین اعتبارسنجی لاراول** مختص برنامه‌های فارسی/ایرانی ارائه می‌دهد. مقایسه با سایر پکیج‌های مشابه:

ویژگیاین پکیجسایریناعتبارسنجی کد اقتصادی✅❌اعتبارسنجی پلاک خودرو✅❌اعتبارسنجی شماره حساب بانکی✅❌تشخیص بانک از BIN کارت✅❌`PersianRule` Enum ایمن از نظر نوع✅❌`MobileFormat` Enum✅❌الگوریتم Luhn برای کارت بانکی✅✅اعتبارسنجی کامل IBAN (شبا)✅✅اعتبارسنجی کد ملی با checksum✅✅تبدیل اعداد فارسی به انگلیسی✅ناقصپیام‌های خطا دو زبانه (fa/en)✅ناقص---

📋 پیش‌نیازها
------------

[](#-پیش‌نیازها)

وابستگینسخهPHP`^8.2`Laravel`^11.0`، `^12.0`، یا `^13.0`---

📦 نصب
-----

[](#-نصب)

از طریق Composer نصب کنید:

```
composer require fallahalireza/persian-tools-laravel
```

پکیج از طریق قابلیت auto-discovery لاراول به صورت خودکار ثبت می‌شود — نیازی به ثبت دستی provider نیست.

### انتشار فایل پیکربندی (اختیاری)

[](#انتشار-فایل-پیکربندی-اختیاری)

```
php artisan vendor:publish --tag="persian-tools-config"
```

### انتشار فایل‌های زبان (اختیاری)

[](#انتشار-فایل‌های-زبان-اختیاری)

```
php artisan vendor:publish --tag="persian-tools-lang"
```

---

⚙️ پیکربندی
-----------

[](#️-پیکربندی)

پس از انتشار، فایل `config/persian-tools.php` را ویرایش کنید:

```
return [
    /*
    |--------------------------------------------------------------------------
    | ثبت قوانین به صورت رشته در validator لاراول
    |--------------------------------------------------------------------------
    | در صورت فعال بودن، می‌توانید قوانین مانند 'ir_national_id'، 'persian_alpha'
    | و غیره را به صورت رشته در آرایه $rules استفاده کنید.
    */
    'register_rules' => true,

    /*
    |--------------------------------------------------------------------------
    | پذیرش اعداد فارسی به صورت سراسری
    |--------------------------------------------------------------------------
    | در صورت فعال بودن، اعداد فارسی (۰-۹) قبل از اعتبارسنجی
    | به معادل ASCII تبدیل می‌شوند.
    */
    'accept_persian_numbers' => false,
];
```

---

🚀 نحوه استفاده
--------------

[](#-نحوه-استفاده)

سه روش برای استفاده از این پکیج وجود دارد:

### روش اول: استفاده رشته‌ای (نیاز به `register_rules = true`)

[](#روش-اول-استفاده-رشته‌ای-نیاز-به-register_rules--true)

ساده‌ترین روش — استفاده از نام قوانین به صورت رشته:

```
$request->validate([
    'name'        => 'required|persian_alpha',
    'mobile'      => 'required|ir_mobile',
    'national_id' => 'required|ir_national_id',
    'birth_date'  => 'required|persian_date',
    'card_number' => 'required|ir_bank_card',
    'plate'       => 'required|ir_license_plate',
    'eco_code'    => 'required|ir_economic_code',
    'sheba'       => 'required|ir_iban',
    'postal_code' => 'required|ir_postal_code',
]);
```

### روش دوم: استفاده از کلاس (همیشه در دسترس)

[](#روش-دوم-استفاده-از-کلاس-همیشه-در-دسترس)

استفاده مستقیم از کلاس‌های قانون برای کنترل کامل پارامترها:

```
use FallahAlireza\PersianTools\Rules\PersianAlpha;
use FallahAlireza\PersianTools\Rules\IranianNationalId;
use FallahAlireza\PersianTools\Rules\IranianMobile;
use FallahAlireza\PersianTools\Rules\IranianBankCardNumber;
use FallahAlireza\PersianTools\Rules\IranianPhone;
use FallahAlireza\PersianTools\Rules\IranianLicensePlate;
use FallahAlireza\PersianTools\Enums\MobileFormat;

$request->validate([
    'name'   => ['required', new PersianAlpha],
    'mobile' => ['required', new IranianMobile(format: MobileFormat::Zero)],
    'card'   => ['required', new IranianBankCardNumber(separator: '-')],
    'phone'  => ['required', new IranianPhone(withAreaCode: true, areaCodeSeparator: '-')],
    'plate'  => ['required', new IranianLicensePlate(allowMotorcycle: true)],
]);
```

### روش سوم: استفاده از Enum ایمن (همیشه در دسترس)

[](#روش-سوم-استفاده-از-enum-ایمن-همیشه-در-دسترس)

از `PersianRule` enum برای جلوگیری از اشتباه تایپی استفاده کنید:

```
use FallahAlireza\PersianTools\Enums\PersianRule;

$request->validate([
    'name'        => ['required', PersianRule::PersianAlpha->value],
    'mobile'      => ['required', PersianRule::IranianMobile->value],
    'national_id' => ['required', PersianRule::IranianNationalId->value],
]);
```

---

📋 تمام قوانین اعتبارسنجی
------------------------

[](#-تمام-قوانین-اعتبارسنجی)

### 🔤 متن و اعداد فارسی

[](#-متن-و-اعداد-فارسی)

قانون رشته‌ایکلاستوضیحمثال معتبرمثال نامعتبر`persian_alpha``PersianAlpha`حروف فارسی، علائم نگارشی و فاصله`سلام علی‌رضا``Hello``persian_alpha_num``PersianAlphaNum`حروف فارسی + اعداد فارسی`سلام۱۲۳``Hello 123``persian_alpha_eng_num``PersianAlphaEngNum`حروف فارسی + اعداد فارسی/انگلیسی`سلام123``Hello``persian_num``PersianNum`فقط اعداد فارسی`۱۲۳۴۵``12345``persian_not_accept``PersianNotAccept`رد هر محتوای فارسی`Hello 123``سلام`---

### 📅 تاریخ شمسی

[](#-تاریخ-شمسی)

قانون رشته‌ایپارامترهاتوضیح`persian_date``separator`، `convertPersianNumbers`تاریخ شمسی معتبر`persian_date_between``startDate`، `endDate`، `separator`، `convertPersianNumbers`تاریخ در محدوده (غیر شامل)`persian_month`—نام ماه شمسی معتبر`persian_day`—نام روز هفته فارسی معتبر**مثال‌ها:**

```
use FallahAlireza\PersianTools\Rules\PersianDate;
use FallahAlireza\PersianTools\Rules\PersianDateBetween;

// جداکننده پیش‌فرض '/' است — مثلاً ۱۴۰۳/۰۶/۳۱
new PersianDate()

// جداکننده سفارشی
new PersianDate(separator: '-')  // مثلاً ۱۴۰۳-۰۶-۳۱

// پذیرش اعداد فارسی مانند ۱۴۰۳/۰۶/۳۱
new PersianDate(convertPersianNumbers: true)

// اعتبارسنجی تاریخ بین دو تاریخ (غیر شامل)
new PersianDateBetween('1400/01/01', '1403/12/29')
```

---

### 📱 شماره تلفن

[](#-شماره-تلفن)

قانون رشته‌ایکلاسپارامترهامثال معتبر`ir_mobile``IranianMobile``format`، `convertPersianNumbers``09123456789`، `+989123456789``ir_phone``IranianPhone``withAreaCode`، `areaCodeSeparator`، `withCountryCodeFormat`، `convertPersianNumbers``02112345678``ir_phone_area_code``IranianPhoneAreaCode``convertPersianNumbers``021`، `031`، `044`**گزینه‌های فرمت موبایل:**

```
use FallahAlireza\PersianTools\Rules\IranianMobile;
use FallahAlireza\PersianTools\Enums\MobileFormat;

new IranianMobile(format: MobileFormat::All)       // هر فرمتی (پیش‌فرض)
new IranianMobile(format: MobileFormat::Zero)      // فقط 09xxxxxxxxx
new IranianMobile(format: MobileFormat::PlusCode)  // فقط +98xxxxxxxxx
new IranianMobile(format: MobileFormat::ZeroCode)  // فقط 0098xxxxxxxxx
new IranianMobile(format: MobileFormat::Code)      // فقط 98xxxxxxxxx
new IranianMobile(format: MobileFormat::Normal)    // فقط 9xxxxxxxxx
```

**تلفن ثابت با کد منطقه:**

```
use FallahAlireza\PersianTools\Rules\IranianPhone;

new IranianPhone(withAreaCode: true)                              // 02112345678
new IranianPhone(withAreaCode: true, areaCodeSeparator: '-')      // 021-12345678
new IranianPhone(withAreaCode: false)                             // 12345678 (بدون کد منطقه)
```

---

### 🪪 شناسه‌ها

[](#-شناسه‌ها)

قانون رشته‌ایکلاستوضیحمثال معتبر`ir_national_id``IranianNationalId`کد ملی ۱۰ رقمی با checksum`0013542419``ir_company_id``IranianCompanyId`شناسه ملی اشخاص حقوقی`14007650912``ir_economic_code``IranianEconomicCode`کد اقتصادی ۱۴ رقمی ⭐`14004800101010`---

### 🏦 بانکداری

[](#-بانکداری)

قانون رشته‌ایکلاستوضیح`ir_bank_card``IranianBankCardNumber`کارت بانکی ۱۶ رقمی (الگوریتم Luhn + تشخیص BIN)`ir_iban``IranianIban`شماره شبا با اعتبارسنجی checksum کامل`ir_bank_account``IranianBankAccountNumber`شماره حساب بانکی ⭐**استفاده پیشرفته از بانکداری:**

```
use FallahAlireza\PersianTools\Rules\IranianBankCardNumber;
use FallahAlireza\PersianTools\Rules\IranianIban;

// تشخیص نام بانک از شماره کارت
$rule = new IranianBankCardNumber();
$bank = $rule->detectBank('6037991234567890');
// خروجی: "بانک ملی ایران"

// پذیرش کارت با جداکننده خط تیره: 6037-9912-3456-7890
new IranianBankCardNumber(separator: '-')

// شبا بدون پیشوند 'IR'
new IranianIban(withPrefix: false)

// شبا با پیشوند 'IR' (پیش‌فرض)
new IranianIban(withPrefix: true)
```

---

### 📍 سایر

[](#-سایر)

قانون رشته‌ایکلاسپارامترهاتوضیح`ir_postal_code``IranianPostalCode``separator`کد پستی ۱۰ رقمی`ir_license_plate``IranianLicensePlate``allowMotorcycle`پلاک خودرو و موتورسیکلت ⭐**مثال‌ها:**

```
use FallahAlireza\PersianTools\Rules\IranianLicensePlate;
use FallahAlireza\PersianTools\Rules\IranianPostalCode;

// فقط پلاک اتومبیل: مثلاً ۱۲الف۳۴۵۶۷
new IranianLicensePlate()

// پذیرش پلاک موتورسیکلت هم: مثلاً ۱۲۳۴۵۶۷۸۹
new IranianLicensePlate(allowMotorcycle: true)

// کد پستی بدون جداکننده: 1234567890
new IranianPostalCode()

// کد پستی با جداکننده: 12345-67890
new IranianPostalCode(separator: '-')
```

---

🔢 مرجع Enum‌ها
--------------

[](#-مرجع-enum‌ها)

### `PersianRule` Enum

[](#persianrule-enum-1)

Enum ایمن از نظر نوع که نام تمام قوانین را نگاشت می‌کند:

```
use FallahAlireza\PersianTools\Enums\PersianRule;

PersianRule::PersianAlpha->value        // 'persian_alpha'
PersianRule::PersianAlphaNum->value     // 'persian_alpha_num'
PersianRule::PersianNum->value          // 'persian_num'
PersianRule::PersianNotAccept->value    // 'persian_not_accept'
PersianRule::IranianMobile->value       // 'ir_mobile'
PersianRule::IranianPhone->value        // 'ir_phone'
PersianRule::IranianNationalId->value   // 'ir_national_id'
PersianRule::IranianCompanyId->value    // 'ir_company_id'
PersianRule::IranianEconomicCode->value // 'ir_economic_code'
PersianRule::IranianBankCard->value     // 'ir_bank_card'
PersianRule::IranianIban->value         // 'ir_iban'
PersianRule::IranianBankAccount->value  // 'ir_bank_account'
PersianRule::IranianPostalCode->value   // 'ir_postal_code'
PersianRule::IranianLicensePlate->value // 'ir_license_plate'
PersianRule::PersianDate->value         // 'persian_date'
PersianRule::PersianMonth->value        // 'persian_month'
PersianRule::PersianDay->value          // 'persian_day'
```

### `MobileFormat` Enum

[](#mobileformat-enum-1)

```
use FallahAlireza\PersianTools\Enums\MobileFormat;

MobileFormat::All       // هر فرمتی (پیش‌فرض)
MobileFormat::Zero      // شروع با 0: 09...
MobileFormat::PlusCode  // شروع با +98: +989...
MobileFormat::ZeroCode  // شروع با 0098: 00989...
MobileFormat::Code      // شروع با 98: 989...
MobileFormat::Normal    // شروع با 9: 9...
```

---

🌐 بومی‌سازی
-----------

[](#-بومی‌سازی)

این پکیج با پیام‌های خطای **فارسی (fa)** و **انگلیسی (en)** ارائه می‌شود.

زبان پیش‌فرض را در `config/app.php` تنظیم کنید:

```
'locale' => 'fa', // یا 'en'
```

تغییر به ازای درخواست:

```
app()->setLocale('fa');
```

برای سفارشی‌سازی پیام‌ها، فایل‌های زبان را منتشر کرده و ویرایش نمایید:

```
lang/
  fa/persian-tools.php
  en/persian-tools.php

```

---

🧪 تست‌ها
--------

[](#-تست‌ها)

```
composer test
```

اجرا با پوشش کد:

```
composer test-coverage
```

تحلیل استاتیک:

```
composer analyse
```

فرمت کد:

```
composer format
```

---

🤝 مشارکت
--------

[](#-مشارکت)

مشارکت شما خوشایند است! لطفاً مراحل زیر را دنبال کنید:

1. ریپازیتوری را Fork کنید
2. یک شاخه ویژگی بسازید: `git checkout -b feature/my-feature`
3. تغییرات خود را Commit کنید: `git commit -m 'Add my feature'`
4. شاخه را Push کنید: `git push origin feature/my-feature`
5. یک Pull Request باز کنید

لطفاً قبل از ارسال مطمئن شوید که تمام تست‌ها pass می‌شوند و کد از استانداردهای PSR-12 پیروی می‌کند.

---

📄 مجوز
------

[](#-مجوز)

مجوز MIT. برای اطلاعات بیشتر [LICENSE](LICENSE) را ببینید.

**توسعه داده شده با ❤️ توسط [علیرضا فلاح](https://github.com/fallahalireza)**

###  Health Score

42

—

FairBetter than 88% of packages

Maintenance91

Actively maintained with recent releases

Popularity13

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity49

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 ~0 days

Total

2

Last Release

60d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/70032867?v=4)[Alireza Fallah](/maintainers/fallahalireza)[@fallahalireza](https://github.com/fallahalireza)

---

Top Contributors

[![fallahalireza](https://avatars.githubusercontent.com/u/70032867?v=4)](https://github.com/fallahalireza "fallahalireza (3 commits)")

---

Tags

laravelvalidationBanknational codeJalaliiranpersianshamsifarsiiranian

###  Code Quality

TestsPest

Static AnalysisPHPStan

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/fallahalireza-persian-tools-laravel/health.svg)

```
[![Health](https://phpackages.com/badges/fallahalireza-persian-tools-laravel/health.svg)](https://phpackages.com/packages/fallahalireza-persian-tools-laravel)
```

###  Alternatives

[iamfarhad/validation

🇮🇷 Complete Laravel Persian validation package - Iranian national ID, mobile numbers, Shamsi dates, IBAN/Sheba, postal codes &amp; more. Modern Laravel 10-13 support with both ValidationRule objects &amp; string-based rules.

3017.3k](/packages/iamfarhad-validation)[laravel/mcp

Rapidly build MCP servers for your Laravel applications.

77922.3M186](/packages/laravel-mcp)[axlon/laravel-postal-code-validation

Worldwide postal code validation for Laravel

3893.6M1](/packages/axlon-laravel-postal-code-validation)[wendelladriel/laravel-validated-dto

Data Transfer Objects with validation for Laravel applications

772649.9k18](/packages/wendelladriel-laravel-validated-dto)[yajra/laravel-oci8

Oracle DB driver for Laravel via OCI8

8793.2M25](/packages/yajra-laravel-oci8)[propaganistas/laravel-disposable-email

Disposable email validator

6023.0M7](/packages/propaganistas-laravel-disposable-email)

PHPackages © 2026

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