Regular Expression ساده ولی معما!؟!؟! (حرفه ای ها)

k2-4u

Well-Known Member
متن زیر رو ببینید

Khobiiiiiiii
Naaaaaa

یک کد Regular Expression
که اگر از هر حرفی بیشتر از 3 بار تکرار شد .
مقدار false برگردونه ؟!!؟؟!!

ساده فقط به نظر می رسه :shock:
 

foranyone

Well-Known Member
میشه با یه تابع هم این کار رو کرد البته شاید چون Regex خوب بلد نیستم می خوام مشکلر و با تابع حل کنم !!!

من جای شما باشم در مورد Khobiiiiiiii این کار رو میکنم !

این رو به صورت آرایه تبدیل میکنم یا بهتر بگم رشته

الان طول رشته رو اندازه میگیرم

سپس تابع array_unique رو روش اعمال می کنم

بازم طول رشته رو اندازه می گیرم

اختلاف رو با طول اولی بررسی میکنم

اگه بیشتر از سه بود false رو بر میگردونم در غیر این صورت true

البته باید بیشتر روش کار کنی من حالت ساده رو گفتم
 

foranyone

Well-Known Member
احتمالا اونوقت باید آقای رئوفی بشینن چند میلیون کلمه رو تعریف کنند و چند گیگابایت هم دیتابیس رو براش اختصاص بدن
4.gif

این که شما گفتید درسته ، ولی برای تعداد محدودی کلمه . . .
دوست عزیز این یه تابع هست که این کار رو انجام میده ، من نمیدونم شما چطور به دیتابیس ربط دادین اینو !!!!!!!!!!!!!!!!!!!

برا چی کلمه تعریف کنن ؟!!!!!!!!!!

یه بار دیگه روش من رو بخونین البته با دقت !!!!

واینم بگم که تابع تکه کدیست که یک کلمه رو به عنوان پارامتر قبول میکند پردازش مورد نظر رو انجام میده و نتیجه رو بر میگردونه !
 

P.H.P

Member
متن زیر رو ببینید

Khobiiiiiiii
Naaaaaa

یک کد Regular Expression
که اگر از هر حرفی بیشتر از 3 بار تکرار شد .
مقدار false برگردونه ؟!!؟؟!!

ساده فقط به نظر می رسه :shock:

PHP:
if(preg_match("(i{3,})", "Khobiiiiiiii"))
    echo true;
else
    echo false;

PHP:
if(preg_match("(a{3,})", "Naaaaaa"))
    echo true;
else
    echo false;


موفق
 

k2-4u

Well-Known Member
foranyone گفت:
این رو به صورت آرایه تبدیل میکنم یا بهتر بگم رشته
الان طول رشته رو اندازه میگیرم
رشته به آرایه چه ربطی داره؟!؟ نفهمیدم؟!
و اینکه اگه من یه جمله 4000 کارکتری داشته باشم
یه آرایه با 4000 عنصر درست کنم . اگر می خواستم این کارو
کنم راه های بهتری هم بود . خیلی ممنون به هر حال


PHP:
if(preg_match("(i{3,})", "Khobiiiiiiii"))
    echo true;
else
    echo false;

PHP:
if(preg_match("(a{3,})", "Naaaaaa"))
    echo true;
else
    echo false;

موفق

مشکل اینطوری حل نمیشه .
منظورم این نبود که فقط دو کلمه khobiiiii و naaa
اینها مثال بود .
منظورم این بود که به هر حرفی که بیشتر از 3 تا بود گیر بده
مثلا یک کد باشه که به جمله های زیر گیر بده
fffaaaeeedddnnn
یا هر حرفه دیگه ای
 
من کد زیر رو با جاوااسکریپت نوشتم.سرور php دم دست نبود.ولی تبدیلش به php کاری نداره.من اینجوری برداشت کردم که اون حرف سه بار پشت سر هم نباید تکرار بشه.اگه قرار باشه اون حرف کلاً نباید سه بار تکرار بشه بحث کلاً فرق میکنه.(مثلاً یه بار کاراکتر اول باشه بعدش کاراکتر پنجم باشه بعدش کاراکتر هفتم باشه.اگه اینجوری بشه یه کم سخت میشه.)
HTML:
<script language="JavaScript" type="text/javascript">
function reg(){
var reg_str=/a{3,}|b{3,}|c{3,}|d{3,}|e{3,}|f{3,}|g{3,}|h{3,}|i{3,}|j{3,}|k{3,}|l{3,}|m{3,}|n{3,}|o{3,}|p{3,}|q{3,}|r{3,}|s{3,}|t{3,}|v{3,}|u{3,}|w{3,}|x{3,}|y{3,}|z{3,}/;
alert(reg_str.test("sallaaam")); 
}
reg();
</script>
 

D.A.V.O.O.D

Member
سلام
همانطور که می دونید این مشکل منم هست اینجا مطرح کردمش !

این کدی که دنی داد رو تست نکردم ، ولی به نظر منطقی نمی رسه که هر 28 حرف انگلیسی رو چک کنیم !

تنها کسی که فکر می کنم بتونه کمک کنه امیر ( Shakkey.Com ) هست ، نشون داده که Regular Expression رو خوب بلده !

منظریم ...
 

ziXet

مدیر انجمن PHP/MYSQL
سلام
همانطور که می دونید این مشکل منم هست اینجا مطرح کردمش !

این کدی که دنی داد رو تست نکردم ، ولی به نظر منطقی نمی رسه که هر 28 حرف انگلیسی رو چک کنیم !

تنها کسی که فکر می کنم بتونه کمک کنه امیر ( Shakkey.Com ) هست ، نشون داده که Regular Expression رو خوب بلده !

منظریم ...
چرا شایعه درست میکنی؟!!

روش dannydolph در صفحه قبل درست بود.
اینم واسه php :
PHP:
    $patt = "a{3,}|b{3,}|c{3,}|d{3,}|e{3,}|f{3,}|g{3,}|h{3,}|i{3,}|j{3,}|k{3,}|l{3,}|m{3,}|n{3,}|o{3,}|p{3,}|q{3,}|r{3,}|s{3,}|t{3,}|v{3,}|u{3,}|w{3,}|x{3,}|y{3,}|z{3,}";
    if(eregi($patt, "sallammmm")) echo "yes";
    else echo "no";
 

k2-4u

Well-Known Member
راهی که dannydolpy گفته بود
به فکرم رسید ولی ؟!؟! a-z به همراه حروف فارسی و کارکتر ها ؟!؟!
یکمی دراز میشه!؟؟!!؟! .
مگر اینکه راه دیگه ای نباشه !؟
 
با تشکر از دوستان.این یه راه بود که به نظرم رسید و از همه دوستان به خاطر لطفشون تشکر میکنم.
 

eAmin

Well-Known Member
سلام.

روش جناب dannydolph بدرستی کار می کنه، ولی انگار داریم لقمه رو دور سرمون می چرخونیم!
با یه روش خیلی ساده هم می شه ابنکار رو کرد! این پترن رو ببینید، دقیقا همون کاری رو می کنه که شما می خواید:
کد:
/[a-z]{3,}/i
اگر می خواید تمامی کاراکترها در نظر گرفته بشن به اینصورت تغییر بدید:
کد:
/(\w){3,}/
برای حروف فارسی:
کد:
/([اآبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی]|[a-z]){3,}/i
--------------------

ولی یه سوال، حالا اگر بخوایم کاراکترهایی که بیش از 3 بار تکرار شده رو replace و بجای اونها همون کاراکترها رو یک بار نمایش بدیم، چه راهی پیشنهاد می کنید؟ مثال:

Khhhhhobiiii
Khobi
 
آخرین ویرایش:

k2-4u

Well-Known Member
سلام.

روش جناب dannydolph بدرستی کار می کنه، ولی انگار داریم لقمه رو دور سرمون می چرخونیم!
با یه روش خیلی ساده هم می شه ابنکار رو کرد! این پترن رو ببینید، دقیقا همون کاری رو می کنه که شما می خواید:
کد:
/[a-z]{3,}/i
اگر می خواید تمامی کاراکترها در نظر گرفته بشن به اینصورت تغییر بدید:
کد:
/(\w){3,}/
برای حروف فارسی:
کد:
/([اآبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی]|[a-z]){3,}/i
--------------------

ولی یه سوال، حالا اگر بخوایم کاراکترهایی که بیش از 3 بار تکرار شده رو replace و بجای اونها همون کاراکترها رو یک بار نمایش بدیم، چه راهی پیشنهاد می کنید؟ مثال:

Khhhhhobiiii
Khobi

این کد درست کار نمیکنه .
با عبارتی مثل
abs
هم مقدار true رو بر می گردونه
 
مشکل pattern ارائه شده اینجاست که اون چک میکنه ببینه از کلاً سه حرف در رشته وجود داره یا نه. و چک نمیکنه ببینه که آیا این سه حرف یکسان هستن یا نه.
یه چیزی میخواستم بگم سریا قبل یادم رفته.اگه کسی راهی به ذهنش میرسه حتی اگه فقط فکر شو میکنه و نمیدونه شدنیه یا نه بگه تا اگه شد دوستان به کد تبدیلش کنن و یه راه بهتر و ابتکاری تر درست کنیم.
 
مشکل pattern ارائه شده اینجاست که اون چک میکنه ببینه از کل حرف ها سه حرف در رشته وجود داره یا نه. و چک نمیکنه ببینه که آیا این سه حرف یکسان هستن یا نه.
یه چیزی میخواستم بگم سریا قبل یادم رفته.اگه کسی راهی به ذهنش میرسه حتی اگه فقط فکر شو میکنه و نمیدونه شدنیه یا نه بگه تا اگه شد دوستان به کد تبدیلش کنن و یه راه بهتر و ابتکاری تر درست کنیم.
 

Allahparast

Member
چرا شایعه درست میکنی؟!!

روش dannydolph در صفحه قبل درست بود.
اینم واسه php :
PHP:
    $patt = "a{3,}|b{3,}|c{3,}|d{3,}|e{3,}|f{3,}|g{3,}|h{3,}|i{3,}|j{3,}|k{3,}|l{3,}|m{3,}|n{3,}|o{3,}|p{3,}|q{3,}|r{3,}|s{3,}|t{3,}|v{3,}|u{3,}|w{3,}|x{3,}|y{3,}|z{3,}";
    if(eregi($patt, "sallammmm")) echo "yes";
    else echo "no";
ببخشین یه سوال از رو حواس پرتی پرسیدم بهش پی بردم ادیت کردم یه سوال دیگه پیش اومد
ممکنه تو رشته Abcaa ای یک حروفش بزرگ باشه نمیشه گفت حروف بزرگ و کوچیک شامل باشه ؟
 
آخرین ویرایش:

eAmin

Well-Known Member
ببخشین یه سوال از رو حواس پرتی پرسیدم بهش پی بردم ادیت کردم یه سوال دیگه پیش اومد
ممکنه تو رشته Abcaa ای یک حروفش بزرگ باشه نمیشه گفت حروف بزرگ و کوچیک شامل باشه ؟
بله می تونید، با اضافه کردن فلگ i.
الگو رو بصورت زیر تغییر بدید:
PHP:
$patt = "#a{3,}|b{3,}|c{3,}|d{3,}|e{3,}|f{3,}|g{3,}|h{3,}|i{3,}|j{3,}|k{3,}|l{3,}|m{3,}|n{3,}|o{3,}|p{3,}|q{3,}|r{3,}|s{3,}|t{3,}|v{3,}|u{3,}|w{3,}|x{3,}|y{3,}|z{3,}#i";
 

جدیدترین ارسال ها

بالا