رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
کاربرد ستاره در preg_match چیست ؟
#1
سلام و عرض خسته نباشید اول خدمت جناب مهندس شهرکی عزیزم و سایر دوستان 
از آنجایی که در مورد رگولار اکسپرسشن مثال ها و محتوای فارسی و کاربردی مناسب کم می باشد و در زبان انگلیسی ضعف نیز وجود دارد خواهشمندم در صورت امکان حقیر را در رابطه با مسئله زیر راهنمایی نمایید.

preg_match("/^[a-zA-Z ]*$/",$name)

مفهوم ستاره در اینجا چی هست مقدور هست این دستور رو برام تشریح کنید تا بتونم تحلیل درستی ازش داشته باشم با تشکر.
پاسخ
تشکر شده توسط:
#2
ستاره یعنی صفر یا هر تعداد کارکتر از مجموعه‌ای که داخل کروشه‌ها مشخص کردین (حروف a-z و A-Z و کارکتر فاصله)
پاسخ
تشکر شده توسط: HTayebi
#3
مهندس یعنی چی 0 ؟  میتونید مثال کاربردی بزنید برام ؟
پاسخ
تشکر شده توسط:
#4
یعنی میتونه هیچ کارکتری هم نباشه. درواقع داره میگه اگه توی متغیر $name کارکترهای a-z و A-Z و کارکتر Space وجود داشت (به هر تعدادی)، نتیجه‌ی true برگردون. بخاطر وجود ^ در ابتدا و $ در انتها، هیچ کارکتر دیگری توی متغیر $name نباید باشه وگرنه نتیجه‌ی false برمیگردونه. یعنی رشته باید با یکی از این کارکترها شروع بشه (بخاطر ^) و حتماً هم باید با یکی از همین کارکترها (بخاطر $) تمام بشه. اما اینکه چه‌تعداد از این کارکترها میتونه وجود داشته باشه، بخاطر وجود * صفر کارکتر یا بیشتره. اگه مثلاً بجای * از کارکتر + استفاده شده بود، حداقل باید یک کارکتر وجود می‌داشت. حتی میشه با آکولاد، حداقل و حداکثر رو هم مشخص کرد. برای مثال:
preg_match('/^[a-zA-Z ]*$/', $name) // zero or more characters of specified class
preg_match('/^[a-zA-Z ]+$/', $name) // one or more characters of specified class
preg_match('/^[a-zA-Z ]{4}$/', $name) // exactly 4 characters of specified class
preg_match('/^[a-zA-Z ]{4,}$/', $name) // 4 or more characters of specified class
preg_match('/^[a-zA-Z ]{,8}$/', $name) // 8 or less characters of specified class
preg_match('/^[a-zA-Z ]{4,8}$/', $name) // 4 to 8 characters of specified class
پاسخ
تشکر شده توسط: HTayebi , Mr.naghlani
#5
با تشکر از پاسخ کامل و محبت آمیزتان استاد عزیزم

echo preg_match("/^[A-Z]*$/",$str);



منظورم فقط اینه که رشته ای که میگیری فقط حروف بزرگ باشه و با حروف بزرگ هم به پایان برسه میتونه رشتم خالی باشه یعنی 0 کاراکتر داشته باشه یا بی نهایت کاراکتر از حرف آ بزرگ انگلیسی تا حرف ز بزرگ انگلیسی  اما وقتی میگیم * میتونه هیچ کاراکتری نداشته باشه بی معنی میشه چون ما نیمخوای مقداری که کاربر برای نام وارد می کنه 0 کاراکتر باشه ما میخوایم به فرض مثال کاربر نامی که وارد می کنه دستم مثلا 10 کاراکتر باشه و نهایت بیشتر از 20 کاراکتر نشه که با این تفاصیل به شکل دیگری می نویسیم این طوری 
echo preg_match("/^[A-Z]{10,20}/",$strx);
 // output true 1
پاسخ
تشکر شده توسط:
#6
بله درست گفتین ولی اینکه معنا داره یا نه، بستگی به نیاز شما داره. مثلاً یه‌جا ممکنه بخواین یا یکی‌از حروف الفبای انگلیسی باشه و یا کلاً خالی بگذاره کاربر (اختیاری باشه). همه‌چیز بستگی به نیاز شما داره. ضمناً اگه بعد از Delimiter پایانی (همون / که در انتهای رشته میگذارین)، کارکتر i بگذارین دیگه به بزرگی و کوچکی حروف حساس نیست و برای مثال A-Z شامل a-z هم میشه. یه الگوی دیگه هم که ممکنه براتون جالب باشه اینه:
'/^0?9[0-39][0-9]{8}$/'

این الگو برای اعتبارسنجی شماره‌ی موبایل کاربرد داره. تفسیرش رو بعنوان تمرین بعهده‌ی خودتون میگذارم Ywink
پاسخ
تشکر شده توسط: HTayebi
#7
Big Grin
استاد برم روش فکر کنم خدمت میرسم
پاسخ
تشکر شده توسط:
#8
با این ^ گفتم‌با ۰ باید شروع بشه با این ؟ گفتم مهم نیست در ادامه کاراکتری وجود داشته باشه یا نه ۹ رو گذاشتم و گفتم بین ۰ تا ۳۹ باید یه عددی وارد بشه که نهایت باید باشه ۳۹ که با ۰ که اول داده بشه ۰۹۳۹ چون ۹۴۰ویا بیشتر که نداریم واسه شماره تلفن همراه بعدش گفتم ۸ عدد دیگه از ۰ تا ۹ باید وارد کرده باشه که بشه مثلا ۰۹۰۱۱۰۰۲۰۰۳۰

اما عدد من شده ۱۲ تا که شماره ۱۱ تاس تا همینقدر تونستم تحلیل کنم ممنون میشم محبت کنید راهنمایی کنید
پاسخ
تشکر شده توسط:
#9
تقریباً درسته. فقط وقتی ? مستقیماً بعد از یک کارکتر میاد یعنی 0 یا 1 عدد (یعنی میتونه باشه یا نباشه - اختیاریه). دقت کنید الگوها کارکتر به کارکتر بررسی میشن. 0-39 یعنی ارقام 0 تا 3 و رقم 9 (نه صفر تا 39) و بعدش هم هشت رقم 0 تا 9 داریم و بعد رشته تمام میشه.
پاسخ
تشکر شده توسط: HTayebi
#10
فهمش برام سخته باید روش فکر کنم
پاسخ
تشکر شده توسط:
#11
استاد پس این طوریم میشه نوشت ؟
'/^0?9[0-3]{1}[0-9]{1}[0-9]{8}$/'
پاسخ
تشکر شده توسط:
#12
نه چون الان گفتین یکی از ارقام صفر تا سه و بعد هم یک رقم صفر تا نه که اشتباهه
پاسخ
تشکر شده توسط: HTayebi
#13
این طوری چی 

'/^09[0-3]{1}[0-9]{1}[0-9]{8}$/'

پاسخ
تشکر شده توسط:
#14
سلام و خسته نباشید 
استاد عذر خواهی می کنم 
چرا خروجی رگولار زیر 0 میشه مگه من درست عمل نکردم درک نمی کنم چرا وقتی به شکل زیر نوشته میشه خروجی فالس هست فقط این شکلی [0-39] منظورتون اینه ؟ [0-3] [0-9] یعنی این 0 که کنار 3 نوشتین برای 9 هم کاربرد داره در واقع خلاصه نویسی کردید ؟ یا نه چون در شکل زیر با مقداری که داخل رشته نامبر قرار گرفته خروجی صفر هست ولی در صورتی که در مثال بعدی می بینید که با کامل کردن دستور و کامل کردن شماره خروجی 1 میشه 

$number = '0901';

echo preg_match('/^0?9[0-39]$/',$number);

ولی خروجی زیر درست میشه 1 

$number = '09010000000';

echo preg_match('/^0?9[0-39][0-9]{8}$/',$number);
پاسخ
تشکر شده توسط:
#15
اولی درست نیست چون شما گفتین بعد از 9 یکی‌از ارقام 0 تا 3 یا 9 میاد و بعد رشته تمام میشه درحالی‌که توی رشته‌ی شما بعد از 0 یک رقم دیگه هم هست و رشته تمام نشده. وقتی با + یا * یا آکولاد، تعداد کارکتر رو مشخص نمیکنین، تعداد 1 عدد درنظر گرفته میشه.
پاسخ
تشکر شده توسط: HTayebi




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