سانسورکردن کلمات نامناسب با PHP

چه صاحب وب‌سایت باشید و چه بازدیدکننده، کامنت‌هایی که شامل کلمات نامناسب و مستهجن باشند، شما را آزار خواهند داد! فکر نمی‌کنم کسی حوصله‌ی ویرایش دستی تمام کامنت‌ها را داشته باشد، برای همین در بسیاری از وب‌سایت‌ها و چت‌روم‌ها تدابیری اندیشیده‌اند که کلمات نامناسب و مستهجن را سانسور کنند.

این یک آموزش سطح پیشرفته نیست، بلکه پیاده‌کردن معلومات ساده‌ایست که قبلاً آموخته‌ایم و می‌خواهیم با این تمرینات، توانایی‌های کدنویسی خود را بهبود ببخشیم.


پیاده‌سازی تابع

تابعی که نوشته‌ام را چند بار با دقت بخوانید:

function censor($string, array $badWords, $character = '*') {
	$newBadWords = [];
	foreach ($badWords as $word) {
		$newBadWords[$word] = str_repeat($character, strlen($word)); 
	}
	return strtr($string, $newBadWords);
}

توضیح کدهای تابع

ساده به نظر می‌رسد! تابعی به نام censor داریم که چند پارامتر می‌گیرد:

  1. پارامتر string که همان رشته‌ای است که می‌خواهیم آن را سانسور کنیم!
  2. پارامتری از نوع آرایه به نام badWords که کلمات نامناسب را در خود نگه می‌دارد.
  3. پارامتری اختیاری به نام character که به صورت پیشفرض ستاره است، اما اگر بخواهیم کلمات نامناسب را با کاراکتر دیگری جایگزین کنیم، در هنگام صدازدن آن را وارد خواهیم کرد.

پس از آن از چندین تابع مربوط به کار با رشته‌ها در PHP استفاده کرده‌ام که فکر می‌کنم توضیح‌دادنشان مفید و برای فهم طرز کار این تابع کافیست.

تابع str_repeat

این تابع دو پارامتر می‌گیرد؛ اولین پارامتر، رشته‌ای است که باید تکرار شود و دومین پارامتر تعیین می‌کند که چند بار باید تکرار صورت گیرد؛ مثلاً می‌توانیم بنویسیم:

str_repeat('bla', 3);

و عبارت blablabla را تحویل بگیریم!

تابع strlen

این تابع برای دریافت طول یک رشته استفاده می‌شود؛ مثلاً با دادن ورودی "Iran" به این تابع، عدد 4 به خروجی فرستاده می‌شود. از آنجا که کلمه‌ی fool چهار کاراکتر و کلمه‌ی stupid شش کاراکتر است، از این تابع استفاده کرده‌ایم که به ازای اولی 4 کاراکتر و به ازای دومی شش کاراکتر ستاره یا غیره قرار دهیم.

تابع strtr

این تابع برای ترجمه‌کردن یا جایگزین‌سازی زیررشته‌هاست و به یکی از دو شکل زیر مورد استفاده قرار می‌گیرد:

strtr    (string $str   , string $from   , string $to) : string
strtr    (string $str   , array $replace_pairs) : string

خروجی در هر دو، از نوع رشته‌ای است؛ اگر از شکل اول تابع استفاده کنیم، باید رشته‌ی ورودی، زیررشته‌ی دلخواه و چیزی که باید به آن ترجمه یا جایگزین شود را وارد کنیم (سه پارامتر شد)، و در شکل دوم تابع، رشته‌ی ورودی و آرایه‌ای که عناصری به صورت from => to دارد را وارد خواهیم کرد. ما از شکل دوم تابع استفاده کرده‌ایم و برای همین با استفاده از foreach آرایه‌ی خود را ساخته‌ایم و هر کلمه‌ی نامناسب را در مقابل کاراکترهایی متناظر قرار داده‌ایم، و آنچه به دست آمده را return می‌کنیم.


$badWords = ['stupid', 'fool', 'foolish'];
$text = 'Hi stupid! How are you?';
$output = censor($text, $badWords, '#');
echo $output;

خروجی کد بالا، عبارت زیر است:

Hi ######! How are you?

تا جایی که به خاطر داشته باشم، تا امروز کسی را به دلیل نظردادن کتک نزده‌ام! پس احساس راحتی کنید و اگر فکر می‌کنید نکته‌ای درباره‌ی این نوشته به ذهنتان می‌رسد، یا می‌توانید تابع را به شکلی ساده‌تر بازنویسی کنید، حتماً با من در میان بگذارید!