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

oldooz

Well-Known Member
سلام و درود
میبخشید که من نظر میدم چون حرفه ای نیستم
شما مشکلتون توی replace کردن یا شرط برای تابع ereg???
 

eAmin

Well-Known Member
اگر از preg_match و بقیه توابع این بسته استفاده می کنید، از همون الگویی که قرار دادم استفاده کنید، ولی eregi خودش case insensitive هست، و همون کد اولی بدرستی کار می کنه و کاراکترهای کوچیک و بزرگ رو در نظر می گیره.
 

D.A.V.O.O.D

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

Khhhhhobiiii
Khobi

سلام ، می گم امین جان ما توی این تاپیک که روش های عجیب و غریب کم ندیدم :D خوب میشه اینم به صورت یه preg_replace کرد که برای جایگزین کردنش یه آرایه بدیم ، یعنی مثلا اگه اینطوری بود : a{4,} => a

دقیق نمی دونم این روش واسه preg_replace هم وجود داره یا خیر چون توی str_replace میشه ( اما نه به صورت پترن )
 

k2-4u

Well-Known Member
کد زیر رو واسش نوشتم
اجرای 100000 بار این کد 2.063191 ثانیه طول کشید
PHP:
function Check($str){
	foreach(str_split($str) as $k=>$one){
		if($str[$k-1]==$one&&$one==$str[$k+1]){ return false; };
	} return true;
}

$str='test the cooode';
Check($str);

اجرای 100000 بار کد زیر هم 6.800296 ثانیه طول کشید

PHP:
function Check($str){
	$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,$str)){ return false; };
}
$str='test the cooode';
Check($str);

فکر کنم regex راهش نبود .
 

D.A.V.O.O.D

Member
سلام کوروش جان ، بله این راه شما منطقی است ، اما فکر نمی کنی هین کدی که زیر نوشته ای اشتباه باشه ؟

$str مگه این آرایه است که داری اینطوری ازش مقدار می گیری ؟ مشکل دیگه ای که داره اینه که اگر $k = 0 باشه توی آرایه ما خونه ی -1 تعریف نشده
 

k2-4u

Well-Known Member
سلام کوروش جان ، بله این راه شما منطقی است ، اما فکر نمی کنی هین کدی که زیر نوشته ای اشتباه باشه ؟

$str مگه این آرایه است که داری اینطوری ازش مقدار می گیری ؟ مشکل دیگه ای که داره اینه که اگر $k = 0 باشه توی آرایه ما خونه ی -1 تعریف نشده
داود یکم به کد دقت کن درسته
تابع str_split رو ببین رشته رو میکنه آرایه

اگر error_repoting فعال باشه ممکنه 2 تا noice بگیره که اشکالی نداره
$k هم هیج وقت نمیشه که 0 بشه (ویرایش : منظورم اینه که مشکل درست نمی کنه )
 
آخرین ویرایش:

D.A.V.O.O.D

Member
داود یکم به کد دقت کن درسته
تابع str_split رو ببین رشته رو میکنه آرایه

اگر error_repoting فعال باشه ممکنه 2 تا noice بگیره که اشکالی نداره
$k هم هیج وقت نمیشه که 0 بشه

کوروش مثال اینجارو ببین : http://ir.php.net/str_split اولین خونه آرایه 0 هست دیگه !
بعدشم بهتر نبود اینطوری کد رو می نوشتی ؟

PHP:
<?PHP
function Check($str){
    $a = str_split( $str );
    foreach( $a as $k => $one )
    {
        if( $a[$k-1] == $one && $one==$a[$k+1])
        { 
            return false;
        }
    }
    return true;
}
$str='test the coooode';
if( Check($str) )
{
    echo "This Is Valid !";
} else
{
    echo "This Is InValid !";
} 
?>
 
آخرین ویرایش:

k2-4u

Well-Known Member
کوروش مثال اینجارو ببین : http://ir.php.net/str_split اولین خونه آرایه 0 هست دیگه !
بعدشم بهتر نبود اینطوری کد رو می نوشتی ؟

PHP:
<?PHP
function Check($str){
    $a = str_split( $str );
    foreach( $a as $k => $one )
    {
        if( $a[$k-1] == $one && $one==$a[$k+1])
        { 
            return false;
        }
    }
    return true;
}
$str='test the coooode';
if( Check($str) )
{
    echo "This Is Valid !";
} else
{
    echo "This Is InValid !";
} 
?>

نه خیر !!!
چرا یه متغییر $a بیشتر . اضافه کنم؟!؟
در ضمن . من دوست دارم if رو این شکلی بنویسم؟!! اشکالی داره؟! جا هم کمتر میگیره؟!
اگر شما فکر بهتری داری بگذار . چرا به برنامه نویسی من گیر میدی؟!؟! :mad:
 

D.A.V.O.O.D

Member
نه خیر !!!
چرا یه متغییر $a بیشتر . اضافه کنم؟!؟
در ضمن . من دوست دارم if رو این شکلی بنویسم؟!! اشکالی داره؟! جا هم کمتر میگیره؟!
اگر شما فکر بهتری داری بگذار . چرا به برنامه نویسی من گیر میدی؟!؟! :mad:

کوروش جان قصد جسارت نداشتما ! من اینو اینطوری نوشتم که هرکی می یاد می بینه بتونه متوجه بشه که چه کار کردی ( حداقل ساده تره ) اگه بخوای اصولی کار کنی ، درستش اینه که $a رو تعریف کنی ، باید جوری باشه که error_reporting در حالت on نیز اروری نده !

البته شما استاد من هستید ، اما من فکر اینو می کنم که اگه توی یه سرور error_reporting روشن بود ، چه کار باید کرد ؟ درست می شه off کرد ، اما برنامه اصولی اینه که هیچ اروری مشاهده نشه ! این یه نظر شخصی هست ، شاید هیچ کس موافق این نظر من نباشه ، اما خوب نظره و واسه هر کس محترم !
 

k2-4u

Well-Known Member
کوروش جان قصد جسارت نداشتما ! من اینو اینطوری نوشتم که هرکی می یاد می بینه بتونه متوجه بشه که چه کار کردی ( حداقل ساده تره ) اگه بخوای اصولی کار کنی ، درستش اینه که $a رو تعریف کنی ، باید جوری باشه که error_reporting در حالت on نیز اروری نده !

البته شما استاد من هستید ، اما من فکر اینو می کنم که اگه توی یه سرور error_reporting روشن بود ، چه کار باید کرد ؟ درست می شه off کرد ، اما برنامه اصولی اینه که هیچ اروری مشاهده نشه ! این یه نظر شخصی هست ، شاید هیچ کس موافق این نظر من نباشه ، اما خوب نظره و واسه هر کس محترم !

ببخشید داود جان . من زود از کوره در رفتم !!
php همون طور که میدونی یه زبانی هستش که
در اون متغییر ها نیاز به تعریف ندارند
اگر اینطوری باشه زمان استفاده از متغییر های $_GET و $_POST
و وقتی که E_NOTICE فعاله مشکل به وجود میاد
یا اینکه باید همه این متغییر ها رو مقدار اولیه بدیم اگر نبودن
یا $_SERVER هم یک سری پارامتر ها داره که . بعضی وقت ها خالی هستن
در ضمن فعال کردن E_NOTICE روی سرور کار اشتباهیه
حالا هر کسی به قول شما نظر خودشو داره
 

D.A.V.O.O.D

Member
خواهش می کنم ، واسه $_POST و $_GET و ... هم میشه با استفاده از isset کاری کرد که NOTICE نده !
 

parsiteam

Member
سلام . منم اومدم :D
چقدر جان جان میکنین شما ها :sad:

یک نکته بگم که حال کنین و دیگه نیازی به تبدیل رشته به آرایه نباشه :

:nokte:هر رشته خودش یک آرایه است !!!!!! :razz:


یعنی اگر رشته ی sasan$ داشته باشیم خودش یک آرایه است و داریم :

PHP:
<?php
$sasan = "Salam Man Sasan Nobakht Hastam !!!!";

echo $sasan[7];

?>
 

k2-4u

Well-Known Member
سرعتش تقریبا هیچ فرقی نکرد
100000 باز اجرای کد شد 2.094121 ثانیه
PHP:
function Check($n){
	$l=strlen($n);
	for($i=0;$i<=$l;$i++){
		if($n[$i-1]==$n[$i]&&$n[$i]==$n[$i+1]) {  
	            return false; 
	    };
	}; return true;
};

var_dump(Check('test the cooode'));
بهتره سخت نگیریم اگه آقا داود مشکلی نداشته
باشه . این کد عالیه

اینم بدون NOTICE

PHP:
function Check($n){
	$l=strlen($n);
	$n[-1]=$n[$l+1]='';
	for($i=0;$i<=$l;$i++){
		if($n[$i-1]==$n[$i]&&$n[$i]==$n[$i+1]) {  
	            return false; 
	    };
	}; return true;
}

var_dump(Check('test the cooode'));
برای کسای که با NOTICE مشکل دارن :D
 
آخرین ویرایش:

D.A.V.O.O.D

Member
چقدر جان جان میکنین شما ها :sad:
می خوای تکه کلام تورو که داداشیه بگیم ؟ :D
:nokte:هر رشته خودش یک آرایه است !!!!!! :razz:
ممنون ، نکته جالبی بود ، تشکر

[/php]برای کسای که با NOTICE مشکل دارن :D

منو می گی ؟ آها حالا شد ! ممنون :D:rose:
 

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

بالا