persian-tools-laravel maintained by fallahalireza
Description
A powerful Laravel package for Persian text utilities, Iranian validation rules, banking tools, national identifiers, Jalali dates, and more.
Author
Last update
2026/05/25 10:29
(dev-main)
License
Downloads
5
🇮🇷 Persian Tools for Laravel
A powerful and comprehensive Laravel validation package for Persian text, Iranian identifiers, banking, dates, license plates, and more.
Developed by Alireza Fallah — fallahalireza/persian-tools-laravel
✨ What makes this package different?
| Feature | This Package | Others |
|---|---|---|
| کد اقتصادی validation | ✅ | ❌ |
| پلاک خودرو validation | ✅ | ❌ |
| شماره حساب بانکی | ✅ | ❌ |
| Bank detection from card BIN | ✅ | ❌ |
Type-safe PersianRule Enum |
✅ | ❌ |
| Luhn algorithm for bank cards | ✅ | ✅ |
| Full IBAN (Sheba) checksum | ✅ | ✅ |
| National ID checksum | ✅ | ✅ |
| MobileFormat Enum | ✅ | ❌ |
📦 Installation
composer require fallahalireza/persian-tools-laravel
Publish config (optional)
php artisan vendor:publish --tag="persian-tools-config"
Publish language files (optional)
php artisan vendor:publish --tag="persian-tools-lang"
⚙️ Configuration
config/persian-tools.php:
return [
// Register rules as Laravel validator strings (default: true)
'register_rules' => true,
// Accept Persian digits globally (default: false)
'accept_persian_numbers' => false,
];
🚀 Usage
String-based (when register_rules = true)
$rules = [
'name' => 'required|persian_alpha',
'mobile' => 'required|ir_mobile',
'national_id' => 'required|ir_national_id',
'birth_date' => 'required|persian_date',
'card' => 'required|ir_bank_card',
'plate' => 'required|ir_license_plate',
'eco_code' => 'required|ir_economic_code',
];
Class-based (always works)
use FallahAlireza\PersianTools\Rules\PersianAlpha;
use FallahAlireza\PersianTools\Rules\IranianNationalId;
use FallahAlireza\PersianTools\Rules\IranianMobile;
use FallahAlireza\PersianTools\Rules\IranianBankCardNumber;
use FallahAlireza\PersianTools\Enums\MobileFormat;
$rules = [
'name' => ['required', new PersianAlpha],
'mobile' => ['required', new IranianMobile(format: MobileFormat::Zero)],
'card' => ['required', new IranianBankCardNumber(separator: '-')],
];
Type-safe Enum
use FallahAlireza\PersianTools\Enums\PersianRule;
$rules = [
'name' => ['required', PersianRule::PersianAlpha->value],
'mobile' => ['required', PersianRule::IranianMobile->value],
];
📋 All Validation Rules
🔤 Persian Text & Numbers
| Rule | Class | Description | Valid | Invalid |
|---|---|---|---|---|
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 Dates
| Rule | Parameters | Description |
|---|---|---|
persian_date |
separator, convertPersianNumbers |
تاریخ شمسی معتبر |
persian_date_between |
startDate, endDate, separator, convertPersianNumbers |
تاریخ بین دو تاریخ |
persian_month |
— | نام ماه شمسی |
persian_day |
— | نام روز هفته |
// Validates 1403/01/01 (not inclusive)
new PersianDateBetween('1400/01/01', '1403/12/29')
// Custom separator
new PersianDate(separator: '-') // e.g. 1403-06-31
📱 Phone Numbers
| Rule | Class | Parameters | Valid |
|---|---|---|---|
ir_mobile |
IranianMobile |
format, convertPersianNumbers |
09123456789, +98912... |
ir_phone |
IranianPhone |
withAreaCode, areaCodeSeparator, withCountryCodeFormat, convertPersianNumbers |
02112345678 |
ir_phone_area_code |
IranianPhoneAreaCode |
convertPersianNumbers |
021, 031 |
use FallahAlireza\PersianTools\Enums\MobileFormat;
new IranianMobile(format: MobileFormat::Zero) // 09123456789 only
new IranianMobile(format: MobileFormat::PlusCode) // +989123456789 only
new IranianPhone(withAreaCode: true, areaCodeSeparator: '-') // 021-12345678
MobileFormat options: All, ZeroCode (0098...), PlusCode (+98...), Code (98...), Zero (0...), Normal (9...)
🪪 Identifiers
| Rule | Class | Description | Valid |
|---|---|---|---|
ir_national_id |
IranianNationalId |
کد ملی (با checksum) | 0013542419 |
ir_company_id |
IranianCompanyId |
شناسه ملی اشخاص حقوقی | 14007650912 |
ir_economic_code |
IranianEconomicCode |
کد اقتصادی ۱۴ رقمی ⭐ | 14004800101010 |
🏦 Banking
| Rule | Class | Description |
|---|---|---|
ir_bank_card |
IranianBankCardNumber |
کارت بانکی (Luhn + BIN detection) |
ir_iban |
IranianIban |
شماره شبا (IBAN checksum) |
ir_bank_account |
IranianBankAccountNumber |
شماره حساب بانکی ⭐ |
// Detect bank name from card
$rule = new IranianBankCardNumber();
$bank = $rule->detectBank('6037991234567890'); // "بانک ملی ایران"
// Card with dash separator
new IranianBankCardNumber(separator: '-') // 6037-9912-3456-7890
// IBAN without IR prefix
new IranianIban(withPrefix: false)
📍 Other
| Rule | Class | Parameters | Description |
|---|---|---|---|
ir_postal_code |
IranianPostalCode |
separator |
کد پستی ۱۰ رقمی |
ir_license_plate |
IranianLicensePlate |
allowMotorcycle |
پلاک خودرو ⭐ |
new IranianLicensePlate() // 12الف34567
new IranianLicensePlate(allowMotorcycle: true) // also 123456789
🌐 Localization
The package supports fa and en error messages.
Set your app locale in config/app.php:
'locale' => 'fa',
Or per-request:
app()->setLocale('fa');
🧪 Testing
composer test
📄 License
MIT License — Alireza Fallah