PDA

View Full Version : حرفه ای: بررسی ثبت نظر کاربر و مقایسه با کلمات لیست سیاه



ghiravani
سه شنبه 17 بهمن 1391, 14:26 عصر
سلام دوستان.خسته نباشید

می خوام برای قسمت ثبت نظرات سایتم یه کاری کنم که زمان ثبت نظر کاربر، متن نظر با لیست کلمات سیاه چک بشه.اگه متن دارای کلمه ای نامربوط بود ، در سایت نمایش داده نشه

برای این کار لازمه یه لیست سیاه از کلمات مدیر سایت بسازه.
سپس زمان ارسال نظر ، تمام کلمات متن نظر کاربر با لیست سیاه مقایسه بشه اگه موردی پیدا شد نظر نمایش داده نشه.

اما یه مشکلی هست. کلمات فارسی معمولا دو قسمتی هستن مثل "می باشد". اگه در دیتابیس کلمه "می باشد" به عنوان لیست سیاه انتخاب بشه ، اما زمان ثبت نظر نمیشه مقایسه انجام داد.چون برای پیدا کردن کلمه در عبارت ، باید بر اساس کاراکتر فاصله ، کلمات رو در متن نظر از هم جدا کرد بعد این کلمات رو با لیست سیاه مقایسه کرد

حالا راهی هست برای مقایسه؟

ممنون

djsaeedkhan
چهارشنبه 18 بهمن 1391, 09:44 صبح
سلام
به نظر من بهتره زمانی که نظر میخاد ثبت بشه بررسی بشه. شما باید لیستی از کلمه ها رو داشته باشی و بعد بیای همه اون کلمات رو با عبارت های داخل متن مقایسه کنی. اگر وجود داشت که خطا بده. البته هر کاری هم انجام بدی صد در صد نمیشه مثلا کلمه مثلا رو میشه مسلاّ نوشت و خوب سیستم شما باید اونقدر هوشمند و به روز باشه که بتونه اینا رو بفهمه. برای شروع بهتره یه جدول بذاری و عبارات رو داخلش قرار بدی و بعدا به مرور زمان آپدیتش کنی
با سپاس

ghiravani
چهارشنبه 18 بهمن 1391, 10:51 صبح
سلام
به نظر من بهتره زمانی که نظر میخاد ثبت بشه بررسی بشه. شما باید لیستی از کلمه ها رو داشته باشی و بعد بیای همه اون کلمات رو با عبارت های داخل متن مقایسه کنی. اگر وجود داشت که خطا بده. البته هر کاری هم انجام بدی صد در صد نمیشه مثلا کلمه مثلا رو میشه مسلاّ نوشت و خوب سیستم شما باید اونقدر هوشمند و به روز باشه که بتونه اینا رو بفهمه. برای شروع بهتره یه جدول بذاری و عبارات رو داخلش قرار بدی و بعدا به مرور زمان آپدیتش کنی
با سپاس

برای این کار کلا دو روش داریم:
1) نظرات هنگام ارسال (قبل از ثبت در دیتابیس)، با دستور زیر به کلمات تفکیک بشن:


<?php

$comment = 'سلام خسته نباشید.می خواستم نظر بفرستم.';

$comment_array = explode(" ",$comment);

/*
مقادیر آرایه خروجی:
سلام
خسته
نباشید
می
خواستم
نظر
بفرستم
*/
?>


بعدش هر کدوم از مقادیر آرایه comment_array رو با کلمات لیست سیاه چک کنیم، اگر چیزی پیدا شد که نظر در دیتابیس ذخیره نشه وگرنه که ذخیره بشه :لبخند:
مشکل این راه اینه که اگر بخوایم کلمات دو قسمتی مثل "می خواستم" رو در لیست سیاه ذخیره کنیم تا فقط همین یک کلمه جزو لیست سیاه باشه اما ترکیبات دیگه این کلمه "می خواستند" دیگه جزو لیست سیاه نباشه ، این کار امکان نداشت. چون در آرایه comment_array ، کلمه "می خواستم" در دو خانه آرایه "می" و "خواستن" ذخیره میشد و دردسر ساز خواهد بود.

راه دوم که دوستمون فرمودن اینه:
یک لیست سیاه درست کنیم(مثل راه اول) که میشه در این لیست کلمات دو قسمتی مثل "می خواستم" هم نوشته بشه.بعدش با یه حلقه while و دستور جستجو در متن نظر ، هر بار که حلقه while اجرا میشه، یک ردیف از جدول لیست سیاه خوانده بشه و همین کلمه در تمام متن نظر جستجو بشه.این کار تا زمان رسیدن به اولین کلمه ای که در لیست سیاه و متن نظر وجود داره تکرار بشه.شاید مثلا بعد از 10 بار خوندن ردیف از لیست سیاه ، کلمه در متن نظر پیدا بشه و حلقه while خاتمه پیدا کنه شاید هم متن نظر همین مشکل خاصی نداشته باشه و به تعداد ردیف های لیست سیاه ، جستجو انجام بشه که اگه لیست سیاه جامع باشه شاید برای هر نظر 3000 بار این فرآیند تکرار بشه که خیلی فشار روی سرور میاره (چون هر بار اجرای حلقه while ، یه دستور sql هم باید برای خوندن ردیف بعدی از لیست سیاه اجرا بشه)


یادمه این چت روم های ایرانی طوری بودن که اگه یه کلمه مورد دار :لبخند: می خواستی بفرستی ، بجای اون کلمه علامت *** میزد. حالا اینا چطور کار می کنن؟؟ (یعنی از روش 1 استفاده میکنن یا روش 2)

ممنون

Reza1607
چهارشنبه 18 بهمن 1391, 11:50 صبح
اگه نمي خواي كه بگي به خاطر وجود كدوم كلمه متن كاربر اجازه انتشار نداره مي توني از كد زير استفاده كني

$blacklist=array("مي خواستم","مي خواستي","مي خواست","مي خواستيم");
//$string=متن كاربر
str_ireplace($blacklist,'',$string,$count);
if($count!=0)
{
echo 'متن شما داراي كلمات غير مجاز است!!!';
exit();
}
البته مي دونم تابع replace براي چه كاري هست ولي ميشه ازش سو استفاده كرد:چشمک:

ghiravani
چهارشنبه 18 بهمن 1391, 12:40 عصر
اگه نمي خواي كه بگي به خاطر وجود كدوم كلمه متن كاربر اجازه انتشار نداره مي توني از كد زير استفاده كني

$blacklist=array("مي خواستم","مي خواستي","مي خواست","مي خواستيم");
//$string=متن كاربر
str_ireplace($blacklist,'',$string,$count);
if($count!=0)
{
echo 'متن شما داراي كلمات غير مجاز است!!!';
exit();
}
البته مي دونم تابع replace براي چه كاري هست ولي ميشه ازش سو استفاده كرد:چشمک:

سلام.ممنونم اما با آرایه که نمیشه راحت کلمه به لیست سیاه اضافه کرد.اینطوری هر بار که بخوام کلمه ای به لیست سیاه اضافه کنم ، باید فایل php رو باز کنم و ویرایش انجام بدم! اما اگه دیتابیسی باشه میشه توی محیط مدیریت یه قسمت برای افزودن کلمه به لیست سیاه درست کرد.با آرایه زمانی که تعداد لغات بالا باشه و بخوام دستی بهش کلمه اضافه کنم امکان افزودن لغات تکراری وجود داره.

الان همین چت روم های ایرانی از چه روشی استفاده می کنن؟؟ کسی از دوستان لغات لیست سیاه چت روم ها رو داره که کارم یکم جلوتر بیفته؟



البته مي دونم تابع replace براي چه كاري هست ولي ميشه ازش سو استفاده كرد:چشمک:
ممنون میشم بگید تابع replace چه باگی داره

با سپاس

Reza1607
چهارشنبه 18 بهمن 1391, 13:18 عصر
خوب براي ليست كلمات سياه من آرايه گذاشتم ولي شما قبلش بياين ليست رو از ديتابيس بخونيد و بعد اون رو تبديل به آرايه كنيد ( يعني داخل آرايه ذخيره كنيد)
منظور من از سو استفاده اين بود كه كار اصلي تابع replace جاي گذاري هست نه جستجو به همين خاطر گفتم سو استفاده

ghiravani
چهارشنبه 18 بهمن 1391, 13:49 عصر
خوب براي ليست كلمات سياه من آرايه گذاشتم ولي شما قبلش بياين ليست رو از ديتابيس بخونيد و بعد اون رو تبديل به آرايه كنيد ( يعني داخل آرايه ذخيره كنيد)
منظور من از سو استفاده اين بود كه كار اصلي تابع replace جاي گذاري هست نه جستجو به همين خاطر گفتم سو استفاده

ممنون اما روش دیگه ای وجود نداره کمتر به سرور فشار بیاره؟ چون اگه سایت پربازدید باشه و در یک لحظه 100 نفر بخوان نظر بفرستن و هر متن نظر هم 500 کاراکتر باشه و توی دیتابیس 3000 لغت لیست سیاه باشه که سرور دان میشه :متعجب: :لبخند:

ممنون

ghiravani
چهارشنبه 18 بهمن 1391, 16:28 عصر
خب برای افزودن تمام لغات موجود در جدول لیست سیاه ، من این قطعه کد رو نوشتم:



$black_list_array = array();
$result = mysql_query("SELECT * FROM `list_blackwords`");
while($row = mysql_fetch_array($result))
{
//echo $row[1]."<br/>";
array_push($black_list_array,$row[1]);
}
print_r($black_list_array);


اما عیب این قطعه کد اینه که برای ساخت آرایه از یه حلقه while استفاده شده که اگه لیست سیاه خیلی جامع باشه (مثلا 3000 تا لغت داشته باشه) و یه کاربر بخواد نظر ثبت کنه ، اون وقت برای هر نظر باید کد داخل حلقه while حدود 3000 بار اجرا بشه و اگر تعداد افراد آنلاین زیاد باشه که دیگه واویلا هست

تابعی نیست که مثل mysql_fetch_array باشه اما بجای اینکه در هر بار اجرا یک ردیف رو برگردونه ، تمام ردیف ها رو نمایش بده؟؟

ممنون

Unique
پنج شنبه 19 بهمن 1391, 11:52 صبح
اگه قرار باشه هر بار شما این اطلاعات را از پایگاه بخونین که خنده داره ! باید پس از هر باز Insert یا update یا delete توی جدول مرکز کنترل شما یک فایل شامل آرایه بسازه (میتونید json کنید) و بعدش دیگه کاری به database نداره و با file_get_contents راحت خونده میشه. در ضمن ف*ی*ل***ت*ر را حتما در زمان ثبت انجام بدین نه نمایش !

توصیه : دوست من این کار خیلی مشکل را حل نمیکنه ! بالاخره میشه یه شکلی نوشت. اگه موضوع خیلی حساسه باید چک بشه مثلا خبرگزاری ها comment ها را هیچوقت بدون بررسی قرار نمیدند یکی از دلایلش همینه.

tehro0n
پنج شنبه 19 بهمن 1391, 14:28 عصر
حروف فارسی و کاراکترهای غیر مجاز معادل های دیگه ای هم دارن که encode میشن، بنابراین بی خیال این موضوع چک بشو، و بهتره برنامت رو جوری بنویسی که موقع ثبت کامنت نمایش داده نشه تا خودت یا مدیریت مربوط به اون قسمت خودش چک کنه

ghiravani
پنج شنبه 19 بهمن 1391, 15:51 عصر
راستش این سیستم رو برای ساخت یک شبکه اجتماعی می خوام که توش عضویت برای ارسال پیام و ... اجباری نباشه ، یعنی هر فردی بتونه بیاد حرف خودش رو بگه و ... . اما چون نمیخوام سایت فی+لت+ر بشه، باید یه 2000 ، 3000 هزارتایی کلمه به لیست سیاه بدم تا هر چیزی نظری نتونه باعث بشه سایت فیل++تر بشه :| نظر شما دوستان واسه این کار چیه؟؟

ممنون

matrixhassan
پنج شنبه 19 بهمن 1391, 22:20 عصر
دوست عزیز تو کد زیر نمیخواد کلمات از هم جدا کنی اگه کلمه مورد نظر تو متن بود خودش پیدا میکنه
گذاشتم شاید به دردت بخوره



$string = "سلام خسته نباشید.می خواستم نظر بفرستم.";

if (strstr($string,"می خواستم"))
{
echo "yes";
}else
{
echo "no";
}