آموزش کامل preg_replace_callback در PHP   مثال‌های کاربردی از Regex

آموزش کامل preg_replace_callback در PHP مثال‌های کاربردی از Regex

امیر بصیر 6 ماه پیش 120 بازدید مدت زمان مطالعه 4 دقیقه

مشخصات وبلاگ

آیدینویسندهتاریخ ایجاد
#45امیر بصیر پنجشنبه ، 1 خرداد 1404
تابع preg_replace_callback یکی از قدرتمندترین ابزارهای PHP برای انجام جایگزینی‌های پیچیده بر اساس الگوهای Regex است. برخلاف preg_replace ساده که فقط جایگزینی ثابت انجام می‌دهد، این تابع امکان پردازش هوشمندانه و پویا را فراهم می‌کند.


برای اطلاعات بیشتر در مورد Regex مقاله: آموزش جامع عبارات باقاعده (Regex) در PHP - از مقدماتی تا پیشرفته را هم مطالعه کنید.


ساختار تابع

preg_replace_callback(
	string|array $pattern,
	callable $callback,
	string|array $subject,
	int $limit = -1,
	int &$count = null,
	int $flags = 0
): string|array|null

پارامترهای ضروری:

1. $pattern: الگوی Regex (می‌تواند رشته یا آرایه باشد)
2. $callback: تابع callback که پردازش را انجام می‌دهد
3. $subject: متن ورودی برای پردازش

پارامترهای اختیاری:

4. $limit: حداکثر تعداد جایگزینی (پیش‌فرض: -1 یعنی نامحدود)
5. $count: تعداد جایگزینی‌های انجام شده (با reference ارسال می‌شود)
6. $flags: Flagهای اختیاری مانند PREG_OFFSET_CAPTURE

آموزش Regex (عبارات منظم)

۱. مبانی اولیه Regex

- \d: هر رقم (معادل [0-9])
- \w: هر حرف، رقم یا زیرخط (معادل [a-zA-Z0-9_])
- \s: هر فاصله سفید (Space, Tab, Newline)
- .: هر کاراکتر به جز خط جدید
- *: ۰ یا بیشتر تکرار
- : ۱ یا بیشتر تکرار
- ?: ۰ یا ۱ تکرار
- {n}: دقیقاً n تکرار
- {n,}: حداقل n تکرار
- {n,m}: بین n تا m تکرار

۲. گروه‌بندی و کپچر

- (pattern): گروه‌بندی و کپچر
- (?:pattern): گروه‌بندی بدون کپچر
- (?<name>pattern): کپچر با نام

۳. کلاس کاراکتر

- [abc]: هر یک از a، b یا c
- [^abc]: هر چیزی به جز a، b یا c
- [a-z]: هر حرف کوچک a تا z

مثال‌های کاربردی با preg_replace_callback

مثال ۱: تبدیل اعداد به معادل حروفی

/**
 * Converts numbers to their word equivalents
 * 
 * @param array $matches Array of matches from preg_replace_callback
 * @return string The replaced text
 */
function numberToWords ( array $matches ): string {
	
	$numberMap = [
		0 => 'صفر', 1 => 'یک', 2 => 'دو', 
		3 => 'سه', 4 => 'چهار', 5 => 'پنج'
	];
	return $numberMap[$matches[1]] ?? $matches[0];
}

$text = "من 3 سیب و 5 پرتقال دارم";
$result = preg_replace_callback (
	'/\b(\d)\b/', 
	'numberToWords', 
	$text
);

// نتیجه: "من سه سیب و پنج پرتقال دارم"

مثال ۲: افزایش اعداد در متن

/**
 * Increments all numbers found in text
 * 
 * @param array $matches Array of matches
 * @return string Incremented number
 */
function incrementNumbers ( array $matches ): string {
	
	return $matches[1]   1;
}

$text = "نسخه 1.2.3 منتشر شد";
$result = preg_replace_callback (
	'/(\d )/',
	'incrementNumbers',
	$text
);

// نتیجه: "نسخه 2.3.4 منتشر شد"

مثال ۳: رمزنگاری ایمیل‌ها

/**
 * Obfuscates email addresses for privacy
 * 
 * @param array $matches Matched email pattern
 * @return string Obfuscated email
 */
function obfuscateEmail ( array $matches ): string {
	
	$parts		= explode ( '@', $matches[0] );
	$username	= substr ( $parts[0], 0, 2 ) . '...';
	return $username . '@' . $parts[1];
}

$text = "Contact us at info@example.com or support@domain.com";
$result = preg_replace_callback (
	'/[a-zA-Z0-9._% -] @[a-zA-Z0-9.-] \.[a-zA-Z]{2,}/',
	'obfuscateEmail',
	$text
);

// Result: "Contact us at in...@example.com or su...@domain.com"

نکات پیشرفته

۱. استفاده از Closure (توابع بی‌نام)

$text	= "Temperature is 25C and 30C";
$result	= preg_replace_callback (
	'/(\d )C/',
	function ( $matches ) {
		return ( $matches[1] * 9/5 )   32 . 'F';
	},
	$text
);

// Result: "Temperature is 77F and 86F"

۲. پردازش چند الگو با یک callback

$patterns = [
	'/\b\d{4}\b/',  // 4-digit numbers
	'/\b[A-Z]{3}\b/' // 3-letter uppercase codes
];

$text	= "Order 1234 with code ABC and 5678 with XYZ";
$result	= preg_replace_callback (
	$patterns,
	function ( $matches ) {
		return str_repeat ( '*', strlen($matches[0] ) );
	},
	$text
);

// Result: "Order  with code * and  with *"

بهترین روش‌های استفاده (Best Practices)

1. اعتبارسنجی الگوها: همیشه الگوهای Regex را قبل از استفاده در تولید تست کنید
2. خطاگیری: از preg_last_error() برای تشخیص خطاها استفاده کنید
3. کارایی: برای متن‌های بزرگ، الگوهای پیچیده ممکن است عملکرد را کاهش دهند
4. خوانایی: برای الگوهای پیچیده از modifier x استفاده کنید تا بتوانید توضیحات اضافه کنید
$pattern = '/
	\b          # Word boundary
	(\d{2,4})   # 2 to 4 digits (year)
	\/          # Separator
	(\d{1,2})   # 1-2 digits (month)
	\/          # Separator
	(\d{1,2})   # 1-2 digits (day)
	\b          # Word boundary
/x';

نتیجه‌گیری

preg_replace_callback ابزار فوق‌العاده‌ای برای انجام جایگزینی‌های پیچیده و پویا در PHP است. با یادگیری اصولی Regex و ترکیب آن با این تابع، می‌توانید پردازش متن‌های پیچیده را به سادگی انجام دهید.
برای تمرین بیشتر می‌توانید:
- سیستم تبدیل تاریخ بین فرمت‌های مختلف را پیاده‌سازی کنید
- یک هایلایتر سینتکس ساده ایجاد کنید
- سیستم مستر کردن خودکار اطلاعات حساس را توسعه دهید
این مقاله به شما کمک می‌کند تا:
- درک عمیق‌تری از preg_replace_callback داشته باشید
- الگوهای Regex را مانند حرفه‌ای‌ها بنویسید
- پردازش متن‌های پیچیده را مدیریت کنید
- کدهای امن‌تر و کارآمدتر بنویسید
,
preg_replace_callbackآموزش Regexعبارات منظم PHPالگوهای پیشرفته جایگزینیآموزش برنامه نویسی PHP

نظرات

برای ارسال نظر باید وارد شوید. ورود یا ثبت نام
هنوز نظری ثبت نشده است.
بازدید روزانه: 28
بازدید هفتگی: 151
بازدید ماهانه: 151
بازدید سالانه: 8070
0%