• 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
پترن‌های preg_match
#1
Photo 
سلام
برای اینکه محتویات یک textbox رو که از فرم ارسال می‌شه ولیدیت کنم از preg_match استفاده کردم ولی در مورد پترن‌های این تابع به مشکل خوردم، توی گوگل سرچ کردم و رسیدم به اینجا تا حدی مسئله حل شد به غیر از یک مورد:

کد پی‌اچ‌پی:
$username $_POST['username'];
if(
preg_match("/^[a-z][a-z0-9][a-z-0-9]+$/i"$username)):
echo 
"Legal Username";
else:
echo 
"Illegal Username";
endif; 

حالت‌های مجازی که می‌تونه باشه "daniel" ، "daniel-12313" ، "daniel345345" و اما با کدی که در بالا من نوشتم این موارد "daniel-" ، "daniel234234-" ، "danie-2344-" رو هم قبول می‌کنه که نمی‌خوام قبول کنه. یعنی می‌خوام اگه آخر عبارت "-" باشه ولید نکنه. با اضافه کردن یک قسمت به شرط تونستم دورش بزنم:

کد پی‌اچ‌پی:
$username $_POST['username'];
if((
preg_match("/^[a-z][a-z0-9][a-z-0-9]+$/i"$username)) && (substr($username, -1) != "-")):
echo 
"Legal Username";
else:
echo 
"Illegal Username";
endif; 

اما ممنون می‌شم راهنمائی کنید که چطور می‌شه با خود preg_match این مسئله رو حل کرد.

مرسیBlush
  پاسخ
تشکر شده توسط : Y.P.Y
#2
سلام
کد:
/^([a-zA-Z0-9_-])+$/i
شامل اعداد، حروف(کوچک و بزرگ)، _ و - هستش.
وبلاگ: Yousha.Blog.ir


کد کمتر => خطای کمتر => قابل فهمتر => خوانایی بیشتر => نگهداری بهتر
  پاسخ
تشکر شده توسط :
#3
از توجه شما ممنونم، اما با پترنی که شما گفتین تست کردم و همچنان مسئله به قوت خودش باقی هست. شاید من خوب نتونستم منظورم رو برسونم پس یک جور دیگه توضیح می‌دم.
وقتی فرم سابمیت می‌شه محتویات فیلد username باید به اینصورت باشه: string یا string-string یا string-intger که مثال عملی می‌شه: daniel یا daniel-ir یا daniel-123
ولی هم با پترنی که خودم نوشتم و هم با پترن شما باز هم این موارد رو قبول می‌کنه که نباید قبول کنه:
کد:
intiger              ==> 124345
intiger-             ==> 1243768-
string-              ==> daniel-
string-intiger-    ==> daniel-345346-
البته تا جائی‌که من اطلاع دارم اگر از i استفاده بشه یعنی هم حروف کوچیک و هم حروف بزرگ مورد قبول هست و نیازی به این نیست که توی پترن هر 2 حالت حروف کوچیک و بزرگ تعریف بشه.

از توجه و راهنمائی شما ممنونمBlush
  پاسخ
تشکر شده توسط :
#4
کد:
'^([a-zA-Z])+(\-[a-zA-Z0-9])*$'
البته من این رو رو تابع ereg اسفاده کردم نمی دونم که رو preg_match هم جواب می ده یا نه!
  پاسخ
تشکر شده توسط :
#5
از توجه شما ممنونم. برای این‌که پترنی که شما نوشتین با preg_match کار کنه باید به اول و آخرش / اضافه بشه اگر نه خطا می‌گیره و می‌گه پترن مشکل داره:
کد:
'/^([a-zA-Z])+(\-[a-zA-Z0-9])*$/'
اما پترن شما فقط string خشک و خالی قبول می‌کنه و باز هم اون هدفی که در پست اول و سوم اشاره کردم برآورد نمی‌کنه.

منتظر راهنمائی‌های ارزنده دوستان هستمBlush
  پاسخ
تشکر شده توسط : Alimokhlesi
#6
کد:
'^([a-zA-Z])+(\-{1}[a-zA-Z0-9]+){0,1}$'
اینو امتحان کن!
دوست عزیز شما دارین بد می نویسید
string یا int نوع دادن یعنی 1234 هم می تونه string باشه هم int
----
اصلاح شد! Cool
مجدد اصلاح شد! Sleepy
مجدد اصلاح شد! Big Grin / تست شد!
  پاسخ
تشکر شده توسط : Alimokhlesi payam Daniel
#7
(۱۳۸۸ شهریور ۲۸, ۰۱:۱۷ ب.ظ)oia نوشته:
کد:
'^([a-zA-Z])+(\-{1}[a-zA-Z0-9]+){0,1}$'
اینو امتحان کن!
دوست عزیز شما دارین بد می نویسید
string یا int نوع دادن یعنی 1234 هم می تونه string باشه هم int
----
اصلاح شد! Cool
مجدد اصلاح شد! Sleepy
مجدد اصلاح شد! Big Grin / تست شد!

ممنونم که اشتباهات من رو تذکر می‌دین، آخه من مبتدی هستم و در حال یاد گیرفتنBlush
با این پترن شما فقط و فقط این حالت رو قبول می‌کنه: daniel-987234 و حالت‌های مجاز دیگه مثل: daniel و daniel8745 رو قبول نمی‌کنه.Sad

مرسیBlush
  پاسخ
تشکر شده توسط :
#8
نقل قول:daniel8745
این جدید! اینو ندیده بودم
شما اخرین اصلاحیه رو استفاده کردید؟
چیزی که من تست کردم Danial-danial و danial-danial12 و danial-12 و danial رو معتبر می دونست!
----
آخرین اصلاحیه:
کد:
'^([a-zA-Z0-9])+(\-{1}[a-zA-Z0-9]+){0,1}$'
یادآوری می کنم که من از تابع ereg استفاده کردم! نه preg_match
حالا این danial12-danial12 رو هم معتبر می دونه!
  پاسخ
تشکر شده توسط : Daniel Alimokhlesi
#9
(۱۳۸۸ شهریور ۲۸, ۰۳:۲۰ ب.ظ)oia نوشته:
نقل قول:daniel8745
این جدید! اینو ندیده بودم
شما اخرین اصلاحیه رو استفاده کردید؟
چیزی که من تست کردم Danial-danial و danial-danial12 و danial-12 و danial رو معتبر می دونست!
----
آخرین اصلاحیه:
کد:
'^([a-zA-Z0-9])+(\-{1}[a-zA-Z0-9]+){0,1}$'
یادآوری می کنم که من از تابع ereg استفاده کردم! نه preg_match
حالا این danial12-danial12 رو هم معتبر می دونه!

آقا محمد دست شما درد نکه با این پترن مسئله حل شد،Heart فقط اول کار عدد رو هم قبول می‌کرد که من پترن رو بصورت زیر تغییر دادم درست شد.
کد:
"/^([a-z])+([a-z0-9])+(\-{1}[a-z0-9]+){0,1}$/i"
اگر وقت داشتین ممنون می‌شم این قسمت {0,1} از پترن رو تفسیر کنین که دقیقا چی می‌گه.

مرسیBlush
  پاسخ
تشکر شده توسط :
#10
کد:
([a-z])+([a-z0-9])
اگه شما از اول شرح می دادی چه ساختاری داری فک کنم سریع تر حل می شد Confused
نقل قول:اگر وقت داشتین
اصلا حرف شو هم نزن! اینقد گیرم که...

ولی خب چیکار می شه کرد. تعداد تفعات تکرار اون کلاس یا مجموعه یا کاراکتر رو مشخص می کنه
کد:
{0}    // tekrar sefr
{1}    // tekrar yek
{2}    // tekrar do
------------------------------------------
{1, }    // hade aghale tekrar yek
{2, }    // hade aghale tekrar do
{3, }    // hade aghale tekrar se
-----------------------------------------
{0,3}    // az sefr tekrar ta se tekrar
{1,4}    // az yek tekrar ta chahar tekrar
{2,5}    // az do tekrar ta panj tekrar
-----------------------------------------
{ ,4}    // hade aksare tekrar chahar
{ ,5}    // hade aksare tekrar panj
{ ,6}    // hade aksare tekrar shish
با انگلیسی که مشکل نداری؟!!! Big Grin
راستی به کوچک بودن حرف دقت کنید!!! Big Grin
  پاسخ
تشکر شده توسط : Daniel Alimokhlesi HiddeN payam


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان