عبارات باقاعده (Regular Expression) که تحت عنوان رجکس (Regex) نیز شناخته میشوند، یکی از بهترین ابزارهای موجود برای بررسی تطابق و عملکرد الگوهای مختلف در رشتههای متنی هستند. در اکثر زبانهای برنامه نویسی استفاده از Regex پذیرفتهشده که در میان این زبانها میتوان به PHP، پایتون و Java اشاره کرد. الگوهای رجکس شامل کاراکترها و عملگرهای خاصی هستند که با استفاده از آنها میتوانید الگوهای دلخواهی را برای جستجو و تطابق با رشتههای مختلف بهوجود آورید.
لازم است اشاره کنیم که چنانچه تازه کار خود را با رجکس شروع کردهاید و به دنبال اطلاعات پایهای مثل دستورات سینتکسی این عبارات یا مفهوم Regex هستید، میتوانید از مقاله اولیه ما در ابن رابطه دیدن بفرمایید.
Regex چیست؟
در مقاله بالا ما به سوالاتی همچون Regex چیست، چه کاربردی دارد، یا اینکه چرا از رجکس استفاده میکنیم، پرداختهایم و دستورات ابتدایی رجکس را بررسی کردهایم و گفتهایم که چطور میتوانید از این دستورات در ابزارهایی همچون سرچ کنسول گوگل استفاده کنید. بد نیست حتی اگر شناخت کافی از دستورات Regex دارید هم مقاله بالا را مطالعه کنید تا بتوانید با ذهنی آمادهتر به بررسی مثالهای موجود در این مقاله بروید.
در این مقاله از آقای وب تصمیم داریم که پا را فراتر بگذاریم و مثالهایی رایجتر با سطح پیچیدگی بالاتر را بررسی کنیم و ببینیم که توسعهدهندگان حرفهای (Senior Developer) در چه مواردی و به چه شکل از دستورات رجکس استفاده میکنند. علاوه بر موارد گفتهشده، نگاهی هم به سایتهای کاربردی در حوزه Regex خواهیم داشت که امکانات مختلفی از جمله ارائه کدهای اماده رجکس، فضای آنلاین برای اجرای دستورات و تمرینات مختلف را در اختیار شما قرار میدهند. در ادامه با ما همراه باشید.
آنچه در این مقاله میخوانید
کاربردهای رجکس (Regex)
کاربردهای Regex بسیار گسترده و متنوع هستند، اما چند کاربرد اصلی برای استفاده از دستورات این تکنولوژی وجود دارد که در ادامه میتوانید آنها را مشاهده کنید.
جستجو در یک رشته: با استفاده از regex میتوانید در یک رشته به دنبال الگوهای مشخصی بگردید؛ به عنوان مثال، با استفاده از الگوی زیر میتوانید تمامی کلمات نوشتهشده به زبان انگلیسی را در داخل یک متن جستجو کنید.
[a-zA-Z]
جایگزینی متن: با استفاده از Regex میتوانید یک الگوی خاص را پیدا کرده و آن را با متن دیگر جایگزین کنید. به عنوان مثال، میتوانید با استفاده از دستور زیر تمامی موارد مشابه old_text در یک متن را با new_text جایگزین کنید.
s/old_text/new_text/g
برش و استخراج اطلاعات: با استفاده از regex میتوانید اطلاعات خاصی را از یک رشته استخراج کنید. به عنوان مثال، میتوانید با استفاده از الگوی زیر، تاریخهای شمسی را از یک متن استخراج کنید.
(\d{3})-(\d{2})-(\d{4})
تحلیل و پردازش دادهها: با استفاده از رجکس میتوانید دادههای متنی را به صورت ساختارمند تحلیل کنید و از آنها برای پردازش و تحلیل دادههای بزرگ استفاده کنید.
نهایتا باید اشاره کنیم که Regex یک ابزار بسیار قدرتمند و مهم در بسیاری از زمینههای محاسباتی و علوم داده است. با استفاده از این تکنولوژی میتوانید کدهای پیچیده را سریعتر و با دقت بیشتری نوشته و دادههای خود را بهصورت ساختارمند پردازش کنید.
نمونه کدهای رجکس برای توسعهدهندگان
همانطور که در بند قبلی مشاهده کردید، تکنولوژی رجکس میتواند یکی از بهترین ابزارها برای استفاده در مشاغل مختلف باشد. گروههای مختلف افراد از جمله برنامه نویسان، مهندسین داده (Data Scientists)، متخصصین SEO و همچنین تولیدکنندگان محتوا همگی از این تکنولوژی برای رفع بسیاری از نیازهای روزانه خود استفاده میکنند اما همچنان میتوان بزرگترین گروه کاربران Regex را «توسعهدهندگان وب و نرم افزار» دانست.
در مقاله پیشین خود اقدام به بررسی دو مورد از نمونه کدهای رجکس نمودیم که شامل نمونه کد اعتبار سنجی ایمیل و رمزعبور میشد. در این مقاله تصمیم داریم به سراغ موارد جدیدتری برویم که نیاز به کدهای پیچیدهتری دارند و موارد استفاده آنها متنوعتر است.
در ادامه 9 مورد از پرکاربردترین کدهای Regex را برای شما آماده کردهایم که به شما این امکان را میدهد که بتوانید از این رشتهکدها در پروژههای مختلف خود استفاده کنید. بد نیست اگر اشاره کنیم که حجم زیادی از موارد شرطی در توسعه فرمها و… بر اساس رجکس پیادهسازی میشوند و این تکنولوژی حتی در زمان کار با فایلهای مدیریتی موتورهای مفسر همچون Apache هم قابل استفاده است. مرور موارد گفتهشده در ادامه به شما کمک میکند تا بتوانید خودتان هم کدهای رجکس را تفسیر کنید و بتوانید متناسب با نیاز خود کدهای جدیدی بنویسید.
1. انطباق نام کاربری با رجکس
همهی ما هر روزه بارها و بارها از نام کاربریهای مختلف استفاده میکنیم. تقریبا امروزه کمتر سایتی را میتوان دید که در زمان ثبتنام از کاربران خود نخواهد که یک نام کاربری برای خود تعیین کنند. هر وبسایتی با توجه به سیاستهای خود، فرمول خاصی را برای تعیین نام کاربری انتخاب میکند. بهعنوان مثال، برخی سایتها بهصورت پیشفرض ایمیل کاربر را بهعنوان نام کاربری منظور میکنند، اما سایتهای دیگر برای اینکه کاربر نتواند از ایمیل بهعنوان نام کاربری استفاده کند، کاراکتر “@” را در میان کاراکترهای ممنوعه در زمان انتخاب نام کاربری قرار میدهند.
فرمول رایج انطباق نام کاربری با استفاده از Regex بهصورت زیر است.
/^[a-zA-Z0-9-]{3,16}$/
در فرمول بالا به مفسر میگوییم که تنها رشتههای متنی برای ما قابل پذیرش هستند (انطباق دارند) که در آنها تنها از حروف کوچگ و بزرگ انگلیسی، اعداد صفر تا 9 و کاراکتر خط تیره “-” استفاده شده باشد. هر کاراکتری غیر از کاراکترهای گفتهشده مورد استفاده قرار گیرد، شرط انطباق نقض شده و کاربر اجازه رفتن به مرحله بعد را نخواهد داشت. نهایتا هم اشاره کردیم که تعداد کاراکترهای مجاز در رشته، حداقل 3 و حداکثر 16 کاراکتر است. شما میتوانید متناسب با سیاست و نیازهای خود، این اسکریپت رجکس را تغییر دهید.
2. انطباق لینکها با استفاده از دستور Regex
یافتن لینکها در یک فایل متنی بسیار بزرگ یا شرطیسازی یک فیلد بر اساس ورود لینک، موضوعی است که در این مثال تصمیم داریم به آن بپردازیم. یکی از بیشترین استفادههای این اسکریپت Regex برای زمانی است که میخواهید فیلدی را طراحی کنید که مربوط به “Embed” کردن دادههای مختلف است.
برای بررسی انطباق یک رشته متنی و یافتن لینک (URL) در آن، میتوانید از دستور رجکس زیر استفاده کنید.
/(https?:\/\/)?(www\.)?[-a-zA-Z0–9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0–9@:%_\+.~#?&//=]*)/
این دستور از پیشوندهای http و https و همچنین عبارت www نیز پشتیبانی میکند. این اسکریپت رجکسی قادر است تا هر لینکی با هر ساختار استانداردی را شناسایی و هایلایت نماید. همچنین بد نیست اگر اشاره کنیم که این دستور رجکس از اسلاگهای متعدد هم پشتیبانی میکند و با ساختار استاندارد URL ها مطابقت دارد.
3. بررسی انطباق IP ورژن 4 (IPv4) با استفاده از رجکس
یکی از پر کاربردترین دستورات Regex برای متخصصین شبکه و مدیران سرور، دستور انطباق IP است. این گروه از کاربران روزانه با دادههای متنی بسیار بزرگی (همچون فایل Log سرور) مواجه هستند که در آنها موارد مختلفی مثل اقدامات سرور، تاریخ و ساعت، IP و… درج شده است. این حجم زیاد دادهها باعث میشود که یافتن یک داده خاص، همچون IP کاربران متصل به سرور به کار دشواری تبدیل شود؛ در این شرایط میتوان با استفاده از دستور رجکس زیر، تنها IP های موجود در فایل لاگ را شناسایی و بررسی کرد.
/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
این دستور بر اساس ساختار استاندارد IP نوشته شده است و بهسادگی میتوانید از آن استفاده کنید.
4. بررسی انطباق استفاده از کدهای HTML
یکی از پرکاربردترین دستورات رجکس برای توسعهدهندگان، اسکریپت یافتن تگهای زبان نشانهگذاری HTML است. با استفاده از این دستور Regex میتوانید کلیه تگهای مختلف HTML را در یک فایل متنی شناسایی کرده، آنها را مشاهده نموده و یا استخراج کنید. برای این کار باید از کد رجکس زیر استفاده نمایید.
/^<([a-z\d]+)([^<]+)*(?:>(.*)<\/\1>|\s*\/>)$/
همانطور که احتمالا با بررسی کد بالا متوجه شدهاید، این رشته کد قادر به شناسایی “Attribute” های متعدد است و مشکلی از این بابت در زمان بررسی وجود ندارد. بد نیست اگر اشاره کنیم که این رشته کد رجکسی، قادر به شناسایی انطباق صحیح تگهای باز و بسته سینتکس HTML نیز هست و در شرایطی که یک ادیتور کد مناسب در اختیار ندارید، حتی میتوانید از این دستور برای بررسی و دیباگ گردن سینتکس کدهای HTML خود استفاده نمایید.
همچنین این دستور تگهای یک بخشی یا همان “selfclosing tag” ها (همچون img ،br یا hr) را هم شناسایی کرده و به شما نشان میدهد.
5. بررسی انطباق تاریخ
یکی دیگر از پرکاربردترین دستورات مورداستفاده در رجکس، دستور شناسایی تاریخ است. این دستور بر اساس استاندارد تاریخ میلادی نوشته شده است و امتیازات مختلفی دارد که استفاده از آن را در شرایط مختلف ممکن میسازد. در دستور زیر تفاوتی ندارد که در رشته متنی ما، مشخصههای «ماه و روز» بهصورت تک کاراکتری (همچون 2) نوشتهاند یا دو کاراکتری (02) و همچنین از اصلیترین کاراکترهای جدا کننده روز، ماه و سال یعنی کاراکترهای “/ . و کاراکتر فاصله” نیز پشتیبانی میکند.
/^([1-2][0-9]|3[0-1]|0?[1-9])([-\.\/ ])(1[0-2]|0?[1-9])(\2)([\d]{4}|[\d]{2})$/
تنها نکته قابل توجه در رابطه با دستور Regex بالا این است که تاریخهایی همچون 31.02.2022 یا 31/02/2019 نیز بر اساس این کد رجکسی انطباق پیدا میکنند، در صورتی که دومین ماه میلادی (February) تنها 28 روز دارد.
6. پیدا کردن دادههای تکراری (Duplicates) در متن
موارد متعددی وجود دارد که باعث میشود نیاز پیدا کنید که دادههای تکراری را در یک متن پیدا کنید. برای این کار میتوانید از دستور رجکسی زیر استفاده کنید.
/(\b\w+\b)(?=.*\b\1\b)/
این دستور تمامی کلماتی که بیشتر از یک بار در متن تکرار شدهاند را برای شما مشخص میکند. گروههای مختلف کاربری از جمله تولیدکنندگان محتوا به استفاده از این ابزار میپردازند و پردازشهایی از جمله بررسی چگالی کلمات کلیدی مختلف را به کمک همین تکه کد بررسی میکنند.
7. پیدا کردن Handler های جاوا اسکریپت به کمک رجکس
فرقی نمیکند که یک ماه از شروع کار شما با جاوا اسکریپت گذشته است یا یک سال؛ در هر شرایطی این شما هستید که باید روزانه با صدها هندلر مختلف جاوا اسکریپتی سر و کله بزنید.
در موارد بسیاری نیاز داریم که بتوانیم کلیه هندلرهای رشته کد جاوا اسکریپتی خود را ببینیم. در این زمان میتوان از دستور رجکسی زیر استفاده کرد.
/\bon\w+=\S+(?=.*>)/
دستور بالا تمامی هندلرهای جاوا اسکریپتی موجود در یک فایل متنی را به شما نشان میدهد که با استفاده از آن در یک فایل JS میتوانید تمامی هندلرهای موجود در آن اسکریپت را شناسایی کنید.
نیاز دارید که علاوه بر هنلدرها بتوانید اِلمان(های) متصل به هر هندلر را هم مشاهده کنید؟ برای این کار میتوانید از کد رجکسی زیر کمک بگیرید.
/(?:<[^>]+\s)(on\S+)=["']?((?:.(?!["']?\s+(?:\S+)=|[>"']))+.)["']?/
به همین سادگی میتوانید بدون استفاده از ادیتورهای متنی و پلاگینهای اضافی و تنها با استفاده از سایتهایی که در ادامه به شما معرفی میکنیم، نسبت به بررسی دادههای متنی خود اقدام نمایید.
8. بررسی انطباق فایلهای مختلف با استفاده از رجکس
موارد مختلفی باعث میشود که بخواهید به دنبال فرمتهای مختلف فایلی در یک فایل متنی مانند یک فایل HTML بگردید. چنانچه تنها به دنبال یک فرمت خاصی از فایلها باشید، کار بسیار ساده خواهد بود، اما چه میشود اگر بخواهید تمامی فایلهای صوتی تصویری موجود در یک رشته متن با فرمتهای مختلفی همچون jpg ،png ،mp4 و mp3 را پیدا کنید؟
در این شرایط میتوانید از رشته کد رجکسی زیر استفاده کنید.
/^[\w,\s-]+\.[A-Za-z]{3}$/
به کمک این دستور رجکس، کلیه فایلهایی که فرمت 3 حرفی دارند (ماننند jpg یا mp4) برای شما مشخص میشوند و میتوانید برای بررسی انطباق، دریافت خروجی و… از آنها استفاده کنید.
این دستور رجکسی توسعهپذیر است و بهسادگی میتوانید با تغییر عدد 3 (که با رنگ قرمز مشخص شده است)، به عدد دلخواه خود، فایلهایی با فرمتی با تعداد کاراکترهای مشخص را پیدا کنید. به عنوان مثال تنها کافیست که عدد 3 را به 4 تغییر دهید تا بتوانید فایلهایی با فرمتهایی همچون docx یا jpeg را مشاهده کنید.
9. بررسی انطباق زمان با استفاده از رجکس
پس از بررسی انطباق تاریخ، نوبت به بررسی انطباق زمان میرسد. از آنجایی که فرمتهای زمانی در سیستمها و سرویسهای مختلف متفاوت هستند، ما هم ترجیحا 2 کد رجکسی برای این منظور ارائه کردهایم که به شما کمک میکند بتوانید از آنها در شرایط مختلف استفاده کنید.
/^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/
اولین کد رجکسی برای انطباق زمان، یک کد همه فن حریف است که در سیستمهایی کاربرد دارد که ما شاهد ثبت مشخصهی ثانیه در فرمت زمان نیستیم؛ یعنی فرمت زمان به شکل HH:MM است. این کد رجکسی بهصورت (Optional Leading 0) نوشته شده است، یعنی فرقی نمیکند که در رشته متنی شما ساعتها به صورت 9:30 ثبت شدهاند یا 09:30؛ این کد قادر است تا تمامی این فرمتهای مختلف را شناسایی و برای شما هایلایت کند.
چنانچه در فایل لاگ شما یا هر رشته متنی دیگری، فرمت ساعت به صورت HH:MM:SS است، میتوانید از کد رجکس زیر استفاده کنید.
/(?:[01]\d|2[0123]):(?:[012345]\d):(?:[012345]\d)/
این کد رجکسی برای ساختار زمانی 24 ساعته نوشته شده است و از “Optional Leading 0” نیز پشتیبانی میکند. لازم است اشاره کنیم که برای استفاده از این کد، قالب ساعت باید حتما به شکل HH:MM:SS باشد و این رشته کد رجکسی قادر به شناسایی ساعت در فرمت HH:MM نیست.
ابزارهای آنلاین Regex
تقریبا میتوان گفت که امروزه برای هر کاری میتوان یک ابزار آنلاین پیدا کرد و اکثر توسعهدهندگان نرم افزارها سعی میکنند که در کنار بستههای نصبی، اقدام به ارائه نرم افزارهای خود بر بستر آنلاین نمایند. توسعهدهندگان علاقهمند به رجکس هم میدان را خالی نکردهاند و میتوان ابزارهای آنلاین جذابی را برای این تکنولوژی پیدا کرد.
ما وبسایتهای مختلفی را در زمینه کار با سینتکس رجکس بررسی نموده و بهترین ابزارهای موجود در این حوزه را برای شما گلچین کردهایم. در ادامه میتوانید لیست پیشنهادی آقای وب برای کار با تکنولوژی رجکس را مشاهده کنید.
regex101.com : بهترین سایت برای تمرین و یادگیری
در میان تمامی گزینههایی که در این مقاله معرفی میکنیم، سایت regex101.com یکی از بهترین هاست.
بهترین ادیتور متنی میان سایتهای مختلف را در سایت regex101.com مشاهده میکنیم. ادیتور متنی این سایت علاوه بر برخورداری از فونت و سایز نوشتاری مناسب، اصول رنگبندی استاندارد برای هایلایت سینتکس رجکس را نیز پشتیبانی میکند.
شاید بتوان یکی از جذابترین بخشهای سایت regex101.com را پنجره “Explanation” آن دانست. تنها کافیست هر دستور رجکسی را در فیلد مربوطه “Regular Expression” وارد کنید تا بتوانید عملکرد آن را در پنجره Explanation مشاهده نمایید. هرچند این پنجره در زمان توضیح دستورات بسیار پیچیده ممکن است توضیحات بسیار زیادی ارائه کند که موجب بیشتر گیجشدن افراد تازهکار شود، اما در زمان توضیح دستورات ساده تا متوسط بسیار کاربردی است و میتواند عملکرد دستوراتی که هیچ شناختی از آنها ندارید را برایتان آشکار سازد.
در زیر پنجره Explantion پنجره دیگری قرار دارد که بهصورت پیشفرض باز نیست و با وارد کردن یکی از دستورات رجکس در فیلد Regular Expression، این پنجره ظاهر میشود. این پنجره Match Information نام دارد و دادههای جزئی در رابطه با ارتباط دستور رجکس با رشته متنی مورد استفاده شما را نشان میدهد. به زبان سادهتر باید گفت که در این پنجره میتوانید موارد انطباق را به همراه شرایطی که موجب انطباق شده است مشاهده کنید.
نهایتا هم در حاشیه سمت راست نمایشگر شاهد پنجره دیگری با نام “Quick Reference” هستیم که به شما امکان میدهد بتوانید با سرعت زیاد رفرنسهای مربوط به دستورات سینتکسی و کاربردهای مختلف رجکس را بررسی کنید. خوشبختانه در این پنجره امکان سرچ میان رفرنسهای مختلف هم تعبیه شده است که فرآیند جستجو میان دستورات و امکانات مختلف رجکس را به کاری ساده تبدیل میکند.
debuggex.com : بهترین سایت برای آشنایی با اکوسیستم رجکس
احتمال کمی وجود دارد که حتی حرفهای ترین کاربران رجکس هم با سایت debuggex.com آشنا باشند! این سایت از سال 2013 مشغول به کار است و میتواند برای افراد علاقهمند به دستورات رجکس بسیار جذاب باشد. این سایت قادر است که هر دستور رجکسی را به یک شماتیک جذاب تبدیل کند که درک عملکرد کد را برای کاربر سادهتر میکند و گروههای مختلف را از یکدیگر متمایز کرده و مقادیر مجاز برای هر شناسه را نیز مشخص مینماید.
به کمک این سایت میتوانید رشتههای متنی مختلفی از جمله کدهای جاوااسکریپت یا پایتون را مورد بررسی و تحلیل قرار دهید و نتایج کد رجکسی خود را در کنار نتایج وشماتیک مربوط به آن مشاهده کنید.
در تصویر بالا ما کد رجکس مربوط به انطباق تاریخ که در همین نوشته به شما معرفی کردیم را در فیلد مربوطه در سایت debuggex.com قرار دادهایم که میتوانید شماتیک تهیهشده برای آن را مشاهده کنید. به کمک این سایت امکان Trace کردن دستورات رجکسی خود را هم دارید و میتوانید به کمک نوار موجود در فضای زیرین فیلد Result، از ابتدای کد به هر قسمتی (Position) از کد خود که تمایل دارید حرکت کنید.
regexpal.com : بهترین سایت برای مشاهده نمونه کارهای دیگران
اگر که کمی با زبان انگلیسی آشنایی داشته باشید، احتمالا میدانید که واژه “Pal” یک اصطلاح بریتانیایی به معنای «رفیق صمیمی» است. سایت regexpal واقعا بر همین اساس تعریف شده و یک محیط جذاب برای کاربران رجکس را فراهم کرده است که در آن میتوان به سادگی نمونه کدهای رجکس دیگران را مشاهده کرد و یا حتی کدهای رجکسی خود را به اشتراک گذاشت. سایت regexpal یک رفیق صمیمی برای کاربران رجکس است و به شما کمک میکند که بتوانید به سادگی کد رجکسی مورد نیاز خود را پیدا کنید.
طراحی انجمن مانند (Forum) این سایت باعث شده که بانک عظیمی از کدهای رجکسی مختلف را در خود جای داده باشد و تقریبا میتوان گفت که امروزه، کمتر کد رجکسی پر کاربردی را میتوان پیدا کرد که در این سایت قابل مشاهده نباشد.
هر زمان که یک کد رجکس در این سایت نوشتید، میتوانید به سادگی یک عنوان برای آن انتخاب کنید و با ذکر توضیحاتی در رابطه با کد رجکسی خود آن را منتشر کنید. شاید برایتان جالب باشد اگر اشاره کنیم که حتی میتوانید در زمان مشاهده کد رجکسی دیگر کاربران برای آنها کامنت بگذارید، پیشنهاد ارتقا برای کد بدهید و کارهای دیگری را انجام دهید که شما را به رفیقهای رجکسیتان نزدیکتر کند!
سخن پایانی
در این مقاله از آقای وب به بررسی چندین مورد از پر کاربردترین دستورات تکنولوژی رجکس و کاربردهای آن پرداختیم. اکنون شما میتوانید به کمک سایتهای معرفیشده در این نوشته، بدون نیاز به هیچ IDE، اقدام به توسعه کدهای رجکسی خود نمایید و حتی آنها را با ما به اشتراک بگذارید!
چنانچه یک دستور رجکسی نوشتهاید که فکر میکنید انتشار آن در این مقاله میتواند برای بقیه مفید باشد، حتما آن را از طریق بخش ارسال نظرات در پایین این صفحه برای ما ارسال کنید؛ همچنین میتوانید کد رجکس خود را در سایت “regexpal” ثبت کنید و لینک آن را با ما به اشتراک بگذارید. کدهای رجکسی شما توسط تیم توسعه آقای وب بررسی میشود و در صورتی که پرکاربرد شمرده شود، با نام خودتان در همین صفحه منتشر خواهد شد.
در پایان امیدواریم که از این نوشته بهره کافی را برده باشید. هدف ما در تیم آقای وب، پاسخگویی به سوالات و برطرف کردن مشکلات اولیه شما در مسیر تبدیل شدن به یک کاربر حرفهای ایرانی و یا یک مدیر سایت متخصص است، پس چنانچه سوالی در رابطه با این نوشته دارید، از طریق بخش ارسال نظرات در پایین این برگه با ما در ارتباط باشید.
موفقیت همراه راهتان باد.
0
0
رای ها
امتیازدهی به مقاله
URL Copied