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

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

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

مفهوم ستاره در اینجا چی هست مقدور هست این دستور رو برام تشریح کنید تا بتونم تحلیل درستی ازش داشته باشم با تشکر.
ستاره یعنی صفر یا هر تعداد کارکتر از مجموعه‌ای که داخل کروشه‌ها مشخص کردین (حروف a-z و A-Z و کارکتر فاصله)
مهندس یعنی چی 0 ؟  میتونید مثال کاربردی بزنید برام ؟
یعنی میتونه هیچ کارکتری هم نباشه. درواقع داره میگه اگه توی متغیر $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
با تشکر از پاسخ کامل و محبت آمیزتان استاد عزیزم

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



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

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

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

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

سلام و خسته نباشید 
استاد عذر خواهی می کنم 
چرا خروجی رگولار زیر 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);
اولی درست نیست چون شما گفتین بعد از 9 یکی‌از ارقام 0 تا 3 یا 9 میاد و بعد رشته تمام میشه درحالی‌که توی رشته‌ی شما بعد از 0 یک رقم دیگه هم هست و رشته تمام نشده. وقتی با + یا * یا آکولاد، تعداد کارکتر رو مشخص نمیکنین، تعداد 1 عدد درنظر گرفته میشه.
صفحات: 1 2