تالار گفتمان nCIS.ir

نسخه‌ی کامل: کاربرد ستاره در preg_match چیست ؟
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
صفحات: 1 2
استاد وقتی به شکل زیر می نویسیم 

$number = '0901';
//$num2 = 0990;
echo preg_match('/^0?9[0-39]{2}$/',$number);

این عدد 9 داخل این [39-0] از 0 تا 9 محاسبه میشه نه از 1 تا 9 درسته ؟ 
بنابراین الان خروجی دستور بالا true خواهد بود فرمودید اگر بعدش تعداد کاراکتر با + یا * یا {} تعداد کاراکتر رو تعین نکنیم یک عدد در نظر میگره و به همین علت خروجی میشه false چون مقداری که من تو مثال قبلی تو رشته داده بودم 4 کاراکتر بود در صورتی که داخل رگولار سه کاراکتر درخواسته کرده بودم درسته ؟ به همین علت false میشده.
بله. دقت کنید که هر کروشه [ ] اصطلاحاً یک کلاس یا گروه تعریف میکنه. وقتی میگیم 0-3 یعنی ارقام 0 تا 3 یعنی 0 و 1 و 2 و 3 و بعد هم کنارش 9 نوشته شده یعنی 9 هم به این مجموعه اضافه میشه. حالا وقتی بعدش نوشتین {2} یعنی کارکترهای این مجموعه دوبار باید تکرار شده باشن.
استاد عزیزم 
وقتی یک بار دیگه دو دستوری که در پست های قبلیم باهاشون مشکل داشتم کنار هم گذاشتم و برای تحلیل بهتر بهشون فکر کردم به این نتایجی که میگم رسیدم.
اولین حالت 0 رو به صورت دلخواه میزاریم و چون ؟ درج شده میتونیم نزاریمش آپشنال هست بعد از اون 9 رو درج کردیم بنابراین تا الان دو تا کاراکتر عددی رو چک کردیم 0 و 9 رو در قسمت بعد بین 0 تا 3 ( 0 1 2 3 ) یه کنترل انجام میدیم که که به فرض اینجا کاربر کاراکتر عددی سوم رو 0 وارد کرده تو متغیر number به این ترتیب خروجی TRUE میشه چیزی که هست وقتی میگیم 0 تا 39 وقتی ما در شماره های تلفن همراه 090 091 093 092 داریم و 094 یا 095 یا 096 تا 099 مفهومی نداره اونم صرفا به این علت که ما شماره تلفن همراهی به نام 0940... یا 0950 نداریم چرا اینجا تو مثالتون از 0-39 استفاده کردید ؟ این چه مفهومی داره ؟ چون با توجه به عرض خودتون کاراکتر به کاراکتر کنترل رو انجام میده پس در مورد 0تا3 به درستی عمل می کنه و من درکش کردم اما این 9 چه مفهومی داره وقتی ما تلفن همراهی با مقادیر 094 095 096 097 098 099 نداریم در واقع از 3 تا 9 نداریم چنین شماره ای در تلفن های همراه
$number = '090';
echo preg_match('/^0?9[0-39]$/',$number);
در صورتی که در حالت دوم نوشتنم اینجا اگر 9 رو وارد نکرده باشیم کنار 3 دقیقا داریم میگیم چون عدد سوم تلفن های همراه خارج 0 1 2 3 نیستن مقدار دیگه ای نباید درج بشه برای همین میخوام بدونم علت استفاده از این عدد 9 کنار سه چی هست ؟ چون هیچ دستور تکراری هم نظیر {} یا + یا * درج نکردید کنار [0-39] و اینکه تازه اگر تکراری هم میزاشتید با دادن این [0-9]{8} باعث میشد که تعداد کاراکتر های اعداد بیشتر از 11 تا بشه و ما شماره تلفن همراهی نداریم که بیشتر از 11 بشه ؟

$number2 = '09010000000';

echo preg_match('/^0?9[0-3][0-9]{8}$/',$number2);

ممنون میشم راهنماییم کنید الان کاملا برام قابل درک هست فقط تنها چیزی که برام سوال شده استفاده از اون عدد 9 کنار عبارت سه به چه منظوری هست چون بالا تر مثال اولیه ای که برای کنترل ورودی جهت دریافت تلفن همراه زده بودید این طوری نوشته شده باتشکر
(08-08-1396، 05:18 ب.ظ)ADMIN نوشته: [ -> ]بله درست گفتین ولی اینکه معنا داره یا نه، بستگی به نیاز شما داره. مثلاً یه‌جا ممکنه بخواین یا یکی‌از حروف الفبای انگلیسی باشه و یا کلاً خالی بگذاره کاربر (اختیاری باشه). همه‌چیز بستگی به نیاز شما داره. ضمناً اگه بعد از Delimiter پایانی (همون / که در انتهای رشته میگذارین)، کارکتر i بگذارین دیگه به بزرگی و کوچکی حروف حساس نیست و برای مثال A-Z شامل a-z هم میشه. یه الگوی دیگه هم که ممکنه براتون جالب باشه اینه:
'/^0?9[0-39][0-9]{8}$/'

این الگو برای اعتبارسنجی شماره‌ی موبایل کاربرد داره. تفسیرش رو بعنوان تمرین بعهده‌ی خودتون میگذارم Ywink
اینجا رو میگم استاد
عبارت سومی که کاربر در ورودی میده باید بین اعداد 0 1 2 3 9 باشه طبق رگولاری که نوشتین سوالی که برام پیش اومده اگر منظورتون رو درست نوشته باشید یعنی ما شماره تلفن های همراه رو با ارقام زیر داریم کنترل می کنیم 
090
091
092
093
099

اگر درست فهمیده باشم فقط برام جای ابهام داره یعنی تلفن همراهی داریم که شمارش این طوری باشه 0990 ؟ اگر داشته باشیم چه طوری میشه که 0940 تا 0980 نداشته باشیم ؟ چون اگر 0940 تا 0980 هم موجود می بود که خب یه مرتبه می نوشتیم 0-9 این طوری از خود 0 تا 9 امکان درج رقم رو داشتیم که به این صورت تمام خطوط زیر رو برای کنترل ورودی کاربر در رقم سوم پوشش میدادیم با رگولاری که نوشتیم.

090
091
092
093
094
095
096
097
098
099


سوال شد برام تقریبا میشه گفت تمام روز رو در گیر فکر کردن بهشون بودم از لحضه ای که مسئله ای قبلی که نوشتم برام حل شد و این مثال رو بهم دادید و گفتین تحلیلش به عنوان تمرین به عهده خودم ممنون میشم راهنماییم کنید.


شماره های تلفن همراه
بله شماره‌های اعتباری همراه اول سری جدید با 0990 شروع میشن. پیش‌شماره‌های 094 تا 098 هنوز واگذار نشده. اگه این شماره‌ها هم گرفته بشه، میتونیم اینطوری بنویسیم:
'/^0?9[0-9]{9}$/'
صفحات: 1 2