preg_match pattern

neorang

New Member
سلام
من یه مشکل بزرگ تو preg_match دارم
می خوام پسوند فایل هارو در بیارم
یعنی بعد از "."
مثلا : برای this_is_my_file.exe
exe رو میخوام در بیارم
pattern چی باشه؟
کمکم میکنید؟
 

shirini_forush

Well-Known Member
اون که preg_match نمیشه باید از lastIndex نقطه به بعد رو subString بگیری.
ولی اگر دنبال یه سری extension خاصی مثلا این میشه برای jpg و png و gif:
PHP:
if(preg_match("/^(png)|(gif)|(jpe?g)$/i",filename))
{
#do something
}
 

neorang

New Member
10x

من از این استفاده کردم و نتیجه گرفتم
PHP:
$extension = substr($file, strrpos($file, '.')+1);
ممنون از راهنماییت
 
آخرین ویرایش:

RainDigital

Member
اگر اسم فایل هم توش نقطه داشت چی؟

مثل بعضی ها که یه فایلو میزارن برای دانلود آدرس سایتشونم میرنن توش.
 

alireza82

Well-Known Member
اگر اسم فایل هم توش نقطه داشت چی؟

مثل بعضی ها که یه فایلو میزارن برای دانلود آدرس سایتشونم میرنن توش.

سلام
منم همین مشکل رو تو سیستم آپلود سنتری که دارم مینویسم داشتم. حالا سوای بحث اسم های پرت و پرت پسوند هایی مثل .tar.gz و .tar.bz هم داریم.
من اومدم از impload و expload استفاده کردم. اگر آرایه ای که بهم برمیگردوند 2 تا خونه داشت خونه آخر و اگر 3تا خونه یا بیشتر داشت با توجه به اینکه پسوندی با بیش از 2 قسمت تاحالا برحسب تجربه کاریم برای هیچ فایلی ندیدم 2 تا خونه آخر رو بر میدارم! و این میشه پسوند.
حالا اگر پسوند یه چیز شناخته شده ای بود و برام تعریف شده بود، که فایل و کپی میکنم وگرنه میگم اسم فایل آپلود شده درست نیست و به کاربر فرمت بندی درست برای یک فایل رو نشون میدم که مثلا فایل میتونه این جوری باشه!
filename.extention
or
filename.extention1.extention2
البته این روش رو من برای این معقول تر میدونم چون تو اسکریپت خودم ادمین قادر هست نوع فایل ها رو مشخص کنه! وگرنه
preg_match روش معقول تری بود! ولی اگر میدونستی دقیقا قراره چه پسوند هایی مجاز باشه!
ولی به هر حال من روش خودم رو تو جاهایی که پسوند هامشخص نیست معقول تر میدونم.
موفق باشید.
 

peyman1987

Member
اگر اسم فایل هم توش نقطه داشت چی؟

مثل بعضی ها که یه فایلو میزارن برای دانلود آدرس سایتشونم میرنن توش.

خوب دوست عزیز neorang درست میگن وقتی شما آخرین نقطه رو بعنوان نقطه قبل از پسوند فایل در نظر بگیری فرقی نمیکنه که توی اسم فایل هم نقطه باشه یا نه. مثلا اگه فایل شما باشه majidonline.com.jpg با کد ایشون از آخرین قطه به بعد برگردونده میشه که میشه jpg. :cool:
 

alireza82

Well-Known Member
خوب دوست عزیز neorang درست میگن وقتی شما آخرین نقطه رو بعنوان نقطه قبل از پسوند فایل در نظر بگیری فرقی نمیکنه که توی اسم فایل هم نقطه باشه یا نه. مثلا اگه فایل شما باشه majidonline.com.jpg با کد ایشون از آخرین قطه به بعد برگردونده میشه که میشه jpg. :cool:

خوب اگر پسوند .tar.gz بود چی ! پست بالایی رو میخوندی همین رو بررسی کرده بودیم!!! اگر پسوند های مجاز مشخص نباشن اون روش اصولی نسیت!
 
آخرین ویرایش:

peyman1987

Member
خوب دوست عزیز الگوریتم شما ایراد داره. اصولیش اینه که شما پسوندهای مجاز رو توی یه آرایه ذخیره کنین و بعد بررسی کنین مثل کد زیر.

PHP:
<?PHP
	$strFileName = "picture.jpg";
	$ValidExtensions = array('jpg','gif','png');
	$strExtension = substr($strFileName,strrpos($strFileName,".")+1);
	PRINT((IN_ARRAY($strExtension,$ValidExtensions))? "Valid":"Invalid");
?>
 

alireza82

Well-Known Member
سلام
چرا ایراد داره! اولا من گفتم معلوم نیست چه پسوند هایی قراره مجاز باشه چون ادمین مشخص میکنه!
دومن الگوریتم شماست که مورد داره چون پسوند هایی مثل .tar.gz یا .tar.bz یا .tar.bz2 رو تشخیص نمیده!
همونطور که گفتم الگوریتم شما زمانی اصولی هست که:
1- پسوند های مجاز از قبل مشخص و تغییری نداشته باشیم! البته میشه تغییر داشت به شرطی که آرایه رو هی عوض کنی حالا چه بریزی تو db چه هی دستی عوض کنی!
2- پسوند هایی 2 قسمته نداشته باشیم!
من کاری که کردم اومدم با یه روش ساده این نوع پسوند هارم میشناسم بعد میبینم تو آرایه پسوند هایی که مربوط به اون گروه تو دیتابیس هست ، این نوع فایل ها مجاز هست یا نه!!!
در کل الگوریتم شما فایل هایی با این شکل رو تشخیص میده file_name.extention نه فایل هایی به صورت file_name.extention1.extention2 مثل همون .tar.gz ای که گفتم! مطمئنن با این نوع پسوند ها آشنا هستید و میدونید که وجود دارن و کاربرد گسترده ای هم برای فشرده سازی دارن! سورس برنامه های لینوکس معمولا به صورت .tar.gz در دسترس قرار میگیرن ( فایل فشردش)
امتحان کن ببین tar.gz رو روش شما invalid میده! چون gz رو برمیگردونه ! نه .tar.gz
موفق باشی
 

shirini_forush

Well-Known Member
من تو همون جواب اول گفتم اگر با RegExp کار نمیکنید حتما lastIndex ه نقطه رو بگیرید.
بخاطر این که خیلی از فایل ها (نه لزوما به خاطر پسوند شون) تعداد بیشتر از 1 نقطه دارن.
مثل flazx که برای جلوگیری از scape شدن اسامی فایل هاش به جای space از نقطه استفاده میکنه.
مثلا:
کد:
asp.net.how.to.program.rar
تازه اگر همه رو هم فاکتور میگرفت و مثلا آندرلاین میذاشت asp.net رو دیگه کاری نمیکرد...
ولی وقتی lastIndex بگیرید دیگه مشکلی نیست.
(خیلی از کارها هم میشه سمت کلاینت انجام داد. هم برای سرعت هم به خاطر یه سری specification های js)
 

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

بالا