PDA

View Full Version : آموزش: آموزش کامل عبارات منظم(RegularExpressions) در PHP



صابر طهماسبی
یک شنبه 20 تیر 1389, 23:30 عصر
به نام خدا
با یه جستجو در تالارها متوجه شدم که کمبود یک مقاله جمع وجور در این زمینه به زبان فارسی احساس می شود به همین دلیل تصمیم گرفتم یک آموزش کامل کار با عبارات منظم در PHP را در حد توان خود شروع کنم.
از دوستان خواهشمندم علاوه بر قوانین سایت (http://barnamenevis.org/forum/misc.php?do=showrules) موارد زیر را در نظر داشته باشند :


برای نظم تاپیک از ارسال موارد غیر ضروری خودداری کنید.
برای تشکر فقط از کلید تشکر استفاده کنید
در صورتی که سوال دارید در تاپیک جداگانه مطرح کنید تا رسیدگی شود
در صورت مشاهده ی اشتباه با پیغام خصوصی به بنده اطلاع دهید تا اصلاح نمایم
بنده سعی می کنم مطالب را کامل بنویسم اما چون این مبحث بسیار گسترده است ممکن است مطالبی جا بماند که به مرور آنها را اضافه خواهم کرد البته نه با افزودن پست جدید بلکه با ویرایش پستهای قبلی انشاءالله

صابر طهماسبی
دوشنبه 21 تیر 1389, 06:37 صبح
قسمت اول-کاراکتر های ویژه در عبارات منظم

فرض را بر این گذاشتم که دوستانی که این تاپیک را می خوانند می دانند عبارات منظم چیست و کاربرد آنها در کجاست.
اما مروری گذرا بر عبارات منظم :

الگو یا pattern یک عبارت منظم است که ما می خواهیم آن را در متنی جستجو کنیم و عملیات لازم را با توابع اینکار با آن انجام دهیم.
مثال: فرض کنید متنی داریم که در آن یک عدد آمده است مثلا متنی حاوی اطلاعات آب و هوای یک شهر دارم که دمای فعلی در آن با یک عدد صحیح مشخص شده است با استفاده از یک الگوی خاص و یکی از توابع کار با الگوها می خواهیم این عدد پیدا کنیم و از متن استخراج کنیم.

این نکته را هم عرض کنم ممکن است در یکی دو قسمت اول مطالب برای شما گنگ باشد هیچ نگران نباشید خودتان حتما مثالها را تست کنید و سعی کنید با دادن مقادیر مختلف کاربرد آنها را در ذهن خود تثبیت کنید.


شروع می کنیم
در کار با عبارات منظم به دو چیز نیاز داریم :


توابع کار با عبارات منظم
الگوها(patterns)


الگو باید بین دو کاراکتر جدا کننده قرار گیرد این کاراکترها معمولا //،## و یا @@ می باشند.
کاراکترهای جدا کننده برای توابع کار با الگو ابتدا و انتهای الگو را مشخص می کنند.

یک تعریف :


رشته ی تهی : رشته ای که هیچ کاراکتری نداشته باشد یا به عبارتی طول آن 0 باشد.


الگو حاوی متا کاراکترها(همون کاراکترهای ویژه) و کاراکترهای عمومی است.
در زیر بخشی از کاراکترهای ویژه را به همراه توضیح مختصر مشاهده می کنید :


. در الگو به معنای این است که هر کاراکتری می تواند ظاهر شود(فقط یک کاراکتر).
* در الگو به این معناست که عبارت قبل از آن می تواند 0 بار یا بیشتر تکرار شود.
+ در الگو به این معناست که عبارت قبل از آن می تواند 1 بار یا بیشتر تکرار شود.
? در الگو به معنای این است که عبارت قبل از آن می تواند ظاهر نشود یا 1 بار ظاهر شود.
{num} عبارت قبل از این به تعداد num باید تکرار شود نه بیشتر و نه کمتر)num یک عدد صحیح است).
{m,n} عبارت قبل از این به تعداد حداقل m و حداکثر بار باید تکرار شود نه بیشتر و نه کمتر)n , m هردو اعداد صحیح هستند).
() هر عبارتی بین پرانتز قرار گیرد به عنوان یک واحد حساب می شود.
[] یک کلاس کاراکتر را مشخص می کند به این معنا که فقط یکی از کاراکتر های تعریف شده داخل آن می توانند ظاهر شوند.
- در الگو برای مشخص کردن محدوده به کار می رود مثلا 9-0.
^ دو حالت می تواند داشته باشد 1.در ابتدای الگو به این معناست که عبارت مورد جستجو باید با عبارتی (کلمه،کاراکتر یا کلاس کاراکتر) که بعد از ^ می آید شروع شود.در داخل [] به این معناست که کاراکتر بعد از آن نباید ظاهر شود.

$ در پایان الگو به این معناست که عبارت مورد جستجو باید با عبارتی(کلمه،کاراکتر یا کلاس کاراکتر) که قبل از $ می آید شروع شود.
| یک عملگر است و به معنای یا می باشد.

چند مثال از الگو ها را با هم بررسی می کنیم:



.*
گفتیم که . یعنی هرکاراکتری می تواند ظاهر شود و * به این معناست که قبل از آن می تواند 0 یا بیشتر بار تکرار شود پس الگوی فوق یعنی "رشته ای از تمام کاراکترها با طول 0 یا بیشتر" یا به عبارت دیگر "یک رشته تهی یا رشته ای غیر تهی با طول دلخواه"



[0-9A-Z]
می دانیم - برای مشخص کردن محدوده به کار می رود و [] برای مشخص کردن اینکه فقط یک کاراکتر از کاراکترهای تعریف شده در [] ظاهر شود پس مثال بالا "یک کاراکتر از 0 تا 9 یا یکی از حروف بزرگ الفبای انگلیسی"





[a-d]
گفتیم که [] یک کلاس کاراکتر را مشخص می کند و از کاراکترهای تعریف شده برای آن فقط یکی می تواند ظاهر شود پس الگوی فوق یعنی "یک کاراکتر از کاراکترهای a تا d"

حالا بیایید کلاس کاراکتر را با * ترکیب کنیم :


[0-9]*
الگوی بالا الگوی یک "عدد صحیح با تعداد رقم 0 یا نامحدود" می باشد.



.+
فرق این الگو با الگوی اول در کاراکتر ویژه ی + می باشد پس بنا به تعریف این کاراکتر الگوی فوق یعنی "رشته ای از کاراکترها با طول حداقل 1 کاراکتر"
ترکیب این کاراکتر را با کلاس کاراکترها دیگر واضح است.


(ab)+
عبارت داخل پرانتز یک واحد محسوب می شود پس الگوی فوق یعنی "رشته ای از تکرار عبارت ab که حداقل آن یک ab است"



[^Ff]

^ در داخل [] به کار رفته به این معنا که "هر کاراکتری بجز F و f"





^(hello)(.*)(welcome)$
الگوی فوق به این معناست :"1-رشته باید با hello شروع شده 2-سپس یک رشته با هر ترکیبی می تواند ظاهر شود3-و در نهایت رشته باید به welcome ختم شود"



salam{1}
فقط رشته ی salam را می پذیرد.


go{1,100}gle
حرف o بین 1 تا 100 بار می تواند ظاهر شود.


(H|B)ook
می دانیم | به معنای "یا" می باشد پس یکی از دو کلمه ی Hook یا Book پذیرفته می شود.

صابر طهماسبی
دوشنبه 21 تیر 1389, 06:57 صبح
قسمت دوم-توابع عبارات منظم

به طور خلاصه 4 تابع برای کار با عبارات منظم داریم:


preg_split - یک رشته را با استفاده از یک الگوی عبارت منظم تکه تکه می کند و حاصل را به صورت یک آرایه بازگشت می دهد.
preg_match - الگوی عبارت منظم را در رشته جستجو می کند.
preg_replace - الگوی عبارت منظم را در یک رشته جستجو کرده و آن را متنی که به آن داده می شود جابجا می کند.
preg_grep - الگوی عبارت منظم را در تمام عناصر یک آرایه جستجو کرده و موارد یافت شده را به صورت یک آرایه بازگشت می دهد.


در ادامه برای هر کدام از توابع بالا یک مثال ذکر می کنیم :




مثال1 :


print_r(preg_split("@\s@", "Jane\tKate\nLucy Marion"));
خروجی :




Array
(
[0] => Jane
[1] => Kate
[2] => Lucy
[3] => Marion
)
توضیح :
در رشته ی مورد نظر 4 اسم داریم که با فاصله از هم جدا شده اند.s\ یک کلاس کاراکتر ویژه است که به جای کاراکتر جدا کننده از آن در الگو استفاده می کنیم.
نکته : کاراکترهای ویژه(متا کاراکترها) برای راحتی کار از قبل تعریف شده اند چند مورد از آنها را در زیر می بینیم:


s\ هر نوع کاراکتر فاصله را مشخص می کند
S\ هر نوع کاراکتر بجز کاراکتر فاصله را مشخص می کند
d\ برای تشخیص اعداد دسیمال استفاده می شود
D\ شناسایی اعداد غیر دسیمال
uXXXX\ یک کاراکتر یونیکد که XXXX کد کاراکتر یونیکد می باشد را مشخص می کند

در این مثال الگو را بین دو @ قرار دادیم، همانطور که در قسمت قبل گفته شد می توان از // یا ## هم استفاده کرد در مثالهای بعد از آنها هم استفاده می کنیم.

مثال 2 :


echo preg_match("#[a-z]#", "s");
خروجی :


1

همانطور که در قسمت اول گفته شد [] یک کلاس کاراکتر است به این معنا که فقط یکی از کاراکتر های داخل آن پذیرفته می شود.الگوی مثال بالا به این معناست که اگر رشته به صورت یکی از کاراکتر های a تا z بود پذیرفته شود که رشته مورد نظر ما s می باشد پس پذیرفته می شود و تابع مقدار 1 را بازگشت می دهد.





مثال 3 :


echo preg_replace("/Jane/","Beky","I saw Jane. Jane was smart.");

خروجی:


I saw Beky. Beky was smart.

در مثال بالا از هیچکدام ا کاراکترهای ویژه استفاده نکردیم پس فقط متن داده شده جستجو و جایگزین می شود.


مثال 4 :


print_r(preg_grep("#Jane#", array("Jane", "jane", "Joan", "JANE")));

خروجی:


Array
(
[0] => Jane
)

اگر دقت کنید در مثال بالا دستور استفاده شده به صورت پیشفرض حساس به متن است و بزرگی و کوچی حروف اهمیت دارد.


مثال 5 :


print_r(preg_grep("#Jane#i", array("Jane", "jane", "Joan", "JANE")));

خروجی :


Array
(
[0] => Jane
[1] => jane
[3] => JANE
)

برای اینکه حساس به متن نباشد بعد از الگو از کاراکتر i استفاده کردیم.

h.alizadeh
دوشنبه 21 تیر 1389, 10:34 صبح
ممنون بابت ایجاد این تایپیک،

اگر ممکنه یه REgEXبرای چک حتما فارسی بودن رشته ورودی بگید. ممنون.


ضمناً اینجا هم یه اموزش regExهست که فکر میکنم مفید باشه:
http://www.barnamenevis.org/forum/showthread.php?p=993290

صابر طهماسبی
سه شنبه 22 تیر 1389, 09:45 صبح
ممنون بابت ایجاد این تایپیک،

اگر ممکنه یه REgEXبرای چک حتما فارسی بودن رشته ورودی بگید. ممنون.


ضمناً اینجا هم یه اموزش regExهست که فکر میکنم مفید باشه:
http://www.barnamenevis.org/forum/showthread.php?p=993290

ممنون از لینکی که گذاشتید
باید با یونیکد آشنا باشید مثال برای فارسی بودن(میشه خلاصش کرد اما این کامله حتی اعراب و حروف الفبای عربی مثل ء هم ساپورت می کنه) :


echo preg_match("#^[\s\x{0621}-\x{063A}\x{0640}-\x{0691}\x{0698}-\x{06D2}0-9]*$#u",'دوست خوب');

نتیجه :


1

موفق باشید

صابر طهماسبی
چهارشنبه 30 تیر 1389, 17:25 عصر
قسمت سوم - الگوهای تودرتو

همانطور که گفته شد عبارت داخل پرانتز به عنوان یک واحد به حساب می آید برای مثال شما می توانید در داخل پرانتز یک الگو تعریف کنید و بر حسب نیاز خود آن را در الگوی کلی به کار ببرید.
به مثالهای زیر توجه کنید :


echo preg_match("/book(shelf|worm)?$/", "book");


خروجی:


1


مثال2:


echo preg_match("/book(shelf|worm)?$/", "bookshelf");

خروجی:


1


مثال3:


echo preg_match("/book(shelf|worm)?$/", "bookworm");

خروجی:


1


مثال4:


echo preg_match("/book(shelf|worm)?$/", "bookstore");

خروجی:


0


اگر با قواعد اولیه آشنا باشید یا پستهای قبلی را مطالعه کرده باشید تحلیل مثالهای بالا بسیار ساده می باشد.

$ M 3 H R D A D $
چهارشنبه 10 شهریور 1389, 23:07 عصر
سلا به همگی!
من تست گرفتم منتها تست درست :لبخندساده: و جواب کاملا درست گرفتم.

مشکل اکثریت دوستان اینه کا کپی - پیست میکنن کد بالایی و و تو کامپایلراشون جوواب 0 میگیرن
اما خو بهتر یکبارم که شده این کد و بریزند تو notepad و اونو با encoding --- utf ذخیره کنن و نتیجه واقعی و ببینند

binyaft
پنج شنبه 11 شهریور 1389, 09:41 صبح
این داره نتیجه 1 میده !!!!!!
فکر کنم این پترنی که اقای طهماسبی نوشتند تعداد کمی از حروف رو پشتیبانی میکنه
حتما شما یه چیزه دیگرو مقایشه کردید

bestirani2
پنج شنبه 11 شهریور 1389, 11:06 صبح
این داره نتیجه 1 میده !!!!!!
فکر کنم این پترنی که اقای طهماسبی نوشتند تعداد کمی از حروف رو پشتیبانی میکنه
حتما شما یه چیزه دیگرو مقایشه کردید
منم به هر حرفی مقایسه کردم 0 میده بیرون

binyaft
پنج شنبه 11 شهریور 1389, 11:27 صبح
من از Xampp استفاده میکنم الان هم داره 1 رو نشون میده

bestirani2
پنج شنبه 11 شهریور 1389, 12:40 عصر
من از Xampp استفاده میکنم الان هم داره 1 رو نشون میده
من هم از Xampp استفاده میکنم و 0 نشون میده :لبخند:
سیستم عاملتون چیه؟

binyaft
پنج شنبه 11 شهریور 1389, 13:36 عصر
Xampp رو XP هست

bestirani2
پنج شنبه 11 شهریور 1389, 14:05 عصر
Xampp رو XP هست
مال من سون هست
نمیدونم چی بگم
بقیه دوستان هم امتحان کنند

$ M 3 H R D A D $
پنج شنبه 11 شهریور 1389, 15:57 عصر
آقا جان عزیزم قصد به چالش کشوندن نداشتم !! :لبخند::لبخند::لبخند::لبخند:

اما من از zend استفاده میکنم این 0 نشون میده به جز یک مورد اون ورودی خالی که یک نشون میده

sama01
پنج شنبه 11 شهریور 1389, 17:13 عصر
برای من 1 می‌ده.

من یه احتمالی می‌دم که مشکل encoding داشته باشید.
اصولا این کد باید جواب بده. من در CharacterMap ویندوز چک کردم و تمام کاراکترهای فارسی رو پوشش می‌ده.

funpatogh
پنج شنبه 11 شهریور 1389, 20:46 عصر
برای من هم 0 نشون میدهد

Vahid Faraji
شنبه 13 شهریور 1389, 23:33 عصر
من خیلی از کاراکترهارو چک کردم، مشکلی نداشت.
--------------------
من خیلی از کاراکترهارو چک کردم، مشکلی نداشت و داره درست کار می کنه.
با سیستم عامل 7 روی wamp

bestirani2
یک شنبه 14 شهریور 1389, 00:04 صبح
این کد قابلیت انتقال نداره
به دلیلی که نمیدونم چیه، هر جا یک چیز نمایش میده

mohmadd
یک شنبه 14 شهریور 1389, 01:41 صبح
برای من 1 نشون میده ویندوز سون xampp

برای اونایی که 0 برمیگردونه دونه دونه کاکتر اصلی رو چک کنن ببینن در کدوم یکیشون ارورمیده. بعد با کم زیاد کردن unicode اونو پیدا کنن.و نتیجه رو اینجا بزارن

bestirani2
یک شنبه 14 شهریور 1389, 02:04 صبح
من این عبارت رو زدم


echo preg_match("#^[\s\x{0621}-\x{063A}\x{0640}-\x{0691}\x{0698}-\x{06D2}0-9]*$#u",'دوست خوب');

echo preg_match("#^[\s\x{0621}-\x{063A}\x{0640}-\x{0691}\x{0698}-\x{06D2}0-9]*$#u",'د');

echo preg_match("#^[\s\x{0621}-\x{063A}\x{0640}-\x{0691}\x{0698}-\x{06D2}0-9]*$#u",'ا');

echo preg_match("#^[\s\x{0621}-\x{063A}\x{0640}-\x{0691}\x{0698}-\x{06D2}0-9]*$#u",'ن');

نتیجه شد

0000

sama01
یک شنبه 14 شهریور 1389, 02:52 صبح
من همچنان مشکل encode رو دلیل این مشکل می‌دونم.
این کد را وارد کنید:



$str = "دوست خوب";

echo 'Encoding is: <b>' . mb_detect_encoding($str) . "</b> and it is ";
echo preg_match("#^[\s\x{0621}-\x{063A}\x{0640}-\x{0691}\x{0698}-\x{06D2}0-9]*$#u",$str)? '<b>valid</b>' : '<b>invalid</b>';

//

خروجی باید این باشد:

Encoding is: UTF-8 and it is valid


امیدوارم مشکل حل بشه.

mohmadd
یک شنبه 14 شهریور 1389, 03:16 صبح
به دلایلی نامعلوم مشکل برای من پیش اومد و مقدار 0 داد .
با کمی پیگیری فکر کنم مشکل رو حل کردم
1.encoding فایل خود را به utf8 تبدیل کنید
2.عبارت زیر رو داخل عبارت خود قرار دهید

\x{003F}
کامل:

echo preg_match("#^[\s\x{0621}-\x{063A}\x{0640}-\x{0691}\x{0698}-\x{06D2}\x{003F}0-9]*$#u",'دوست خوب');

بهتره از گزینه دو استفاده بشه.
و نتیجه رو اینجا بزارید.

sama01
یک شنبه 14 شهریور 1389, 06:25 صبح
پس حدث من در مورد encoding درست بود.

فقط دلیل اضافه کردن اون کد رو متوجه نشدم. اون کد معادل علامت سوال انگلیسی است.
چه دلیلی برای درج اون وجود داره؟

صابر طهماسبی
یک شنبه 14 شهریور 1389, 11:12 صبح
این که در هر صورت جوابش 0 میشه !
درست تست نکردید
می توانید از یکی از تست کننده های آنلاین استفاده کنید :

http://www.quanetic.com/Regex

bestirani2
یک شنبه 14 شهریور 1389, 12:54 عصر
من همچنان مشکل encode رو دلیل این مشکل می‌دونم.
این کد را وارد کنید:



$str = "دوست خوب";

echo 'Encoding is: <b>' . mb_detect_encoding($str) . "</b> and it is ";
echo preg_match("#^[\s\x{0621}-\x{063A}\x{0640}-\x{0691}\x{0698}-\x{06D2}0-9]*$#u",$str)? '<b>valid</b>' : '<b>invalid</b>';

//

خروجی باید این باشد:

Encoding is: UTF-8 and it is valid


امیدوارم مشکل حل بشه.







ولی خروجی این نیست
این هست برای من
Encoding is: UTF-8 and it is invalid
این کد چون قابلیت انتقال نداره، گزینه خوبی برای استفاده نیست
--------------------

به دلایلی نامعلوم مشکل برای من پیش اومد و مقدار 0 داد .
با کمی پیگیری فکر کنم مشکل رو حل کردم
1.encoding فایل خود را به utf8 تبدیل کنید
2.عبارت زیر رو داخل عبارت خود قرار دهید

\x{003F}کامل:

echo preg_match("#^[\s\x{0621}-\x{063A}\x{0640}-\x{0691}\x{0698}-\x{06D2}\x{003F}0-9]*$#u",'دوست خوب');بهتره از گزینه دو استفاده بشه.
و نتیجه رو اینجا بزارید.
من همچنان 0 هستم

صابر طهماسبی
یک شنبه 14 شهریور 1389, 15:06 عصر
ولی خروجی این نیست
این هست برای من
Encoding is: UTF-8 and it is invalid
این کد چون قابلیت انتقال نداره، گزینه خوبی برای استفاده نیست
--------------------

من همچنان 0 هستم
مطمئن باشید کد مشکل ندارد اگر با عبارات منظم و همچنین کدهای یونیکد آشنا باشید این مطلب را تایید می کنید
همانطور که گفتممی توانید از تست کننده های آنلاین استفاده کنید که در شرایط کاملا استاندارد عبارت منظم مورد نظر را تست می کنند می توانید از لینک زیر استفاده کنید :

http://www.quanetic.com/Regex

bestirani2
یک شنبه 14 شهریور 1389, 16:31 عصر
مطمئن باشید کد مشکل ندارد اگر با عبارات منظم و همچنین کدهای یونیکد آشنا باشید این مطلب را تایید می کنید
همانطور که گفتممی توانید از تست کننده های آنلاین استفاده کنید که در شرایط کاملا استاندارد عبارت منظم مورد نظر را تست می کنند می توانید از لینک زیر استفاده کنید :

http://www.quanetic.com/Regex


این که کد مشکل نداره درسته
ولی من در مورد قابلیت حمل دارم صحبت میکنم
نه درستی کد

mohmadd
یک شنبه 14 شهریور 1389, 17:00 عصر
مطمئن باشید کد مشکل ندارد اگر با عبارات منظم و همچنین کدهای یونیکد آشنا باشید این مطلب را تایید می کنید
همانطور که گفتممی توانید از تست کننده های آنلاین استفاده کنید که در شرایط کاملا استاندارد عبارت منظم مورد نظر را تست می کنند می توانید از لینک زیر استفاده کنید :

http://www.quanetic.com/Regex


کد هیچ مشکلی نداره .


من همچنان 0 هستم
برای من که جواب میده .
نکته جالبی که پیدا کردم اینه که با یونیکدی که گذاشتم تمام کلمات فارسی در ANSI
match میشن


شما اینو تست کنید و نتیجه رو بدید تا ببینم چی میشه

$str = 'دوست عزيز';
for ($i = 0; $i < strlen($str); $i++)
{
echo ord(substr($str, $i, $i + 1)) . '<br />';
}

bestirani2
یک شنبه 14 شهریور 1389, 17:34 عصر
کد هیچ مشکلی نداره .


برای من که جواب میده .
نکته جالبی که پیدا کردم اینه که با یونیکدی که گذاشتم تمام کلمات فارسی در ANSI
match میشن


شما اینو تست کنید و نتیجه رو بدید تا ببینم چی میشه

$str = 'دوست عزيز';
for ($i = 0; $i < strlen($str); $i++)
{
echo ord(substr($str, $i, $i + 1)) . '<br />';
}

207
230
211
202
32
218
210
237
210

mohmadd
یک شنبه 14 شهریور 1389, 17:36 عصر
پس حدث من در مورد encoding درست بود.

فقط دلیل اضافه کردن اون کد رو متوجه نشدم. اون کد معادل علامت سوال انگلیسی است.
چه دلیلی برای درج اون وجود داره؟

چون در Ansi کارکترهای unicode ذخیره نمیشن ,اما اگه ذخیره بشن ..... به چی تبدیل میشن ؟ loool

mohmadd
یک شنبه 14 شهریور 1389, 17:47 عصر
نتیجه کار بنده :
1.روش دوم در پست 22 کاملا اشتباهه .. چون همه کاکتر ها به علامت سئوال تبدیل میشن و بعد match میشن که در هر حالت 1 داده میشه
اگه مقدار پارمتر دوم unicode باشه برای تست اون باید encoding صفحه utf8 باشه .
اما در حالت کلی ما از form استفاه میکنیم. کاربر میاد اسمشو مینویسه و بعد submit رو میزنه
اطلاعات پست میشن و بررسی میشه :



<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<form action="http://127.0.0.1/newtest.php" method="post">
<input type="text" name="str" />
<input type="submit" name="sub" />
</form>

<?php


function test($str)
{
return preg_match("#^[\s\x{0621}-\x{063A}\x{0640}-\x{0691}\x{0698}-\x{06D2}0-9]+$#u",$str);
}
echo test($_REQUEST['str']);

?>--------------------


<form action="http://127.0.0.1/newtest.php" method="post">
<input type="text" name="str" />
<input type="submit" name="sub" />
</form>

<?php

echo $_REQUEST['str'];

?>
در این حالت وقتی به page source نگاه میکنم به این حالته :

http://imgdl.ir/images/9261.jpg
میشه در مورد این توضیح بدید ؟

sama01
یک شنبه 14 شهریور 1389, 20:08 عصر
مشکل همان unicode هست.
صفحات شما به صورت utf-8 ذخیره نشده‌اند.
تنها دلیل این مشکل این هست.
صفحات خود را با encoding درست ذخیره کنید.

mohmadd
یک شنبه 14 شهریور 1389, 21:32 عصر
در مورد Encoding باید charset را به utf-8 گذاشت که match بشن.
در مورد سئوالم فقط میخوام بدونم اسم اینا چیه ؟؟

sama01
یک شنبه 14 شهریور 1389, 21:59 عصر
این‌ها کدهای یک کاراکتر utf-8 هستند که از ascii بیرون هستند.
اگر دقت کنید اعداد آن مشابه اعدادی است در regex نوشتیم.

mohmadd
دوشنبه 15 شهریور 1389, 03:08 صبح
خوب مثلا من بخوام در موردش سرچ کنم اسمش چیه ؟

sama01
دوشنبه 15 شهریور 1389, 03:49 صبح
هر چیزی تو مایه های uft8 encoding می‌تونه مطالب خوبی بیاره.
این چند لینک را ببینید:

UTF-8: The Secret of Character Encoding (http://htmlpurifier.org/docs/enduser-utf8.html)
Character Sets / Character Encoding Issues (http://www.phpwact.org/php/i18n/charsets)

خیلی خوب مفهوم encoding رو شرح داده‌اند.
برخی لینک‌های داخلی‌شان هم ارزش‌مند است.

صابر طهماسبی
دوشنبه 15 شهریور 1389, 11:51 صبح
این که کد مشکل نداره درسته
ولی من در مورد قابلیت حمل دارم صحبت میکنم
نه درستی کد
قابلیت حمل به این معناست که کد در سیستم های مختلف و شرایط یکسان درست کار کنه
نه اینکه مثلا کد یک برنامه که تحت دات نت نوشته شده ببرید تو غیر دات نت!خوب معلومه کار نمی کنه چون شرایط اجرا براش مهیا نیست وقتی هم دارید با فارسی کار می کنید باید استاندارد یونیکد را در صفحات رعایت کنید.
دلیل عدم اجرای این کد برای شما در encoding فایلها و صفحات است

شرایط استاندارد کار با متون فارسی تحت وب به صورت زیر است :


فایلها به صورت utf8 ذخیره شوند
encoding صفحه در تگ meta روی utf-8 تنظیم شود
کانکشن بانک اطلاعاتی شما utf-8 باشد

bestirani2
دوشنبه 15 شهریور 1389, 14:40 عصر
قابلیت حمل به این معناست که کد در سیستم های مختلف و شرایط یکسان درست کار کنه
نه اینکه مثلا کد یک برنامه که تحت دات نت نوشته شده ببرید تو غیر دات نت!خوب معلومه کار نمی کنه چون شرایط اجرا براش مهیا نیست وقتی هم دارید با فارسی کار می کنید باید استاندارد یونیکد را در صفحات رعایت کنید.
دلیل عدم اجرای این کد برای شما در encoding فایلها و صفحات است

شرایط استاندارد کار با متون فارسی تحت وب به صورت زیر است :


فایلها به صورت utf8 ذخیره شوند
encoding صفحه در تگ meta روی utf-8 تنظیم شود
کانکشن بانک اطلاعاتی شما utf-8 باشد



این حرف وقی صحیح هست که من اطلاعات رو از یک فرم بگیرم و از بانک اطلاعاتی بخوام
این کد روی 5 تا سرور تست کردم که 2 تاشون جواب صحیح نمیداد و 3 تاشون میداد


$str = 'دوست عزيز';
for ($i = 0; $i < strlen($str); $i++)
{
echo ord(substr($str, $i, $i + 1)) . '<br />';
}
برای شما چی رو نشون میده؟

صابر طهماسبی
دوشنبه 15 شهریور 1389, 17:31 عصر
این حرف وقی صحیح هست که من اطلاعات رو از یک فرم بگیرم و از بانک اطلاعاتی بخوام


بنده شرایط استاندارد کار با متون فارسی را در حالت کلی گفتم که فقط موارد 1و2 به مورد شما ربط دارد




$str = 'دوست عزيز';
for ($i = 0; $i < strlen($str); $i++)
{
echo ord(substr($str, $i, $i + 1)) . '<br />';
}

خوب این کد چه ربطی به عبارات منظمی که بنده نوشتم داره؟

bestirani2
دوشنبه 15 شهریور 1389, 18:18 عصر
بنده شرایط استاندارد کار با متون فارسی را در حالت کلی گفتم که فقط موارد 1و2 به مورد شما ربط دارد



خوب این کد چه ربطی به عبارات منظمی که بنده نوشتم داره؟
می خواهم
ببینم چه اعدادی میده
اگر مربوط به utf-8 باشه باید اعداد متفاوتی با مال من بهتون بده

sama01
دوشنبه 15 شهریور 1389, 19:32 عصر
الآن دوستانی که هنوز مشکا دارند، آیا encoding صفحه را utf8 گذاشته اند.
و یک مورد مهم‌تر این که خود صفحه را utf8 ذخیره می‌کنند یا نه؟

bestirani2
دوشنبه 15 شهریور 1389, 19:39 عصر
الآن دوستانی که هنوز مشکا دارند، آیا encoding صفحه را utf8 گذاشته اند.
و یک مورد مهم‌تر این که خود صفحه را utf8 ذخیره می‌کنند یا نه؟
با اینکه ربطی نداره
آره گذاشتم
من فکر میکنم جواب این به نوع فارسی نویسی کاربر بر میگرده

sama01
دوشنبه 15 شهریور 1389, 20:00 عصر
مسلما این طور نیست.
مگه چند سری کاراکتر فارسی داریم؟

utf8 یه استاندارده. اگر قرار باشه در همه جا یک نباشه که به چه درد می‌خوره؟

bestirani2
دوشنبه 15 شهریور 1389, 21:11 عصر
به هر حال یک چیزی هست
من روی یک سرور تست کردم
از کامپیوترم جواب غلط میگرفت و از نوت بوکم، جواب درست
یعنی به clinet ربط داره
حالا ربطش رو نمیدونم

sama01
دوشنبه 15 شهریور 1389, 21:25 عصر
خوب بستگی داره برنامه‌ای که کد رو داخلش می‌نوشتی، صفحه را با چه encoding ذخیره می‌کرده.
مثلا یادم هست که dreamweaver8 به طرو پیش‌فرض صفحه را با western ذخیره می‌کرد و من همیشه باید در ابتدای نصب برنامه، باید پیش‌فرضش رو به utf8 تغییر می‌دادم.
notepad هم که به طور پیش‌فرض ascii ذخیره می‌کنه.

بستگی به برنامه‌ی شما داره.

مگر نه وقتی همه چیز استاندارد شده باشه، دیگه مشکلی وجود نخواهد داشت. چون Utf8 یک استاندارد است. و استاندارد برای یک‌سان‌سازی است.

bestirani2
دوشنبه 15 شهریور 1389, 22:05 عصر
خوب بستگی داره برنامه‌ای که کد رو داخلش می‌نوشتی، صفحه را با چه encoding ذخیره می‌کرده.
مثلا یادم هست که dreamweaver8 به طرو پیش‌فرض صفحه را با western ذخیره می‌کرد و من همیشه باید در ابتدای نصب برنامه، باید پیش‌فرضش رو به utf8 تغییر می‌دادم.
notepad هم که به طور پیش‌فرض ascii ذخیره می‌کنه.

بستگی به برنامه‌ی شما داره.

مگر نه وقتی همه چیز استاندارد شده باشه، دیگه مشکلی وجود نخواهد داشت. چون Utf8 یک استاندارد است. و استاندارد برای یک‌سان‌سازی است.
همانطور که گفتم از یک سرور ولی با دو کلاینت متفاوت، دو نتیجه متفاوت گرفتم

sama01
دوشنبه 15 شهریور 1389, 22:57 عصر
شما اگر متن را داخل صفحه‌ی php گذاشته باشی که هیچ ربطی به client پیدا نمی‌کنه.
مگر این‌که متن را با از طریف فرم بفرستی.
اگر با فرم می‌فرستی، حتما در meta مشخص کن که صفحه utf8 هست.

bestirani2
دوشنبه 15 شهریور 1389, 23:23 عصر
شما اگر متن را داخل صفحه‌ی php گذاشته باشی که هیچ ربطی به client پیدا نمی‌کنه.
مگر این‌که متن را با از طریف فرم بفرستی.
اگر با فرم می‌فرستی، حتما در meta مشخص کن که صفحه utf8 هست.
همانطور که بالا گفتم داخل فرم گذاشتم و اینم مشخص کردم

ali zi zeperto
پنج شنبه 18 شهریور 1389, 18:32 عصر
سلام.من این تاپیک رو دیر پیدا کردم ولی خوشحالم که پیداش کردم.با تشکر دوباره از صابر طهماسبی یه سوال از اساتید داشتم :من کد زیر رو نوشتم که از توی اون رشته که دادم لینک رو جدا کنه.منتها خروجی برنامه ام چیزی که می خوام نبست.چیکار باید بکنم که اطلاعات بین دو تا تگ باز و بسته لینک رو کامل در یه خونه آرایه داشته باشم.اگر بشه که توی یه متغیر فقط رشته محتوی اطلاعات لینک باشه که چه بهتر.
لطفا راهنمایی بفرمایید.ممنونم

<?php
$contents = "this is the link<a href='http://www.ask.com' title='go to web search engine'>www.ask.com</a>end of example string";
print_r(preg_split("@(<a)(.*)(</a>)$@",$contents));
?>


اینم خروجی :
Array ( [0] => this is the linkwww.ask.com (http://www.ask.com/)end of example string )
من می خوام که اطلاعات بین دو تا تگ باز و بسته فقط نمایش داده بشه یا در متغیری قرار بگیره.

صابر طهماسبی
پنج شنبه 18 شهریور 1389, 21:00 عصر
سلام.من این تاپیک رو دیر پیدا کردم ولی خوشحالم که پیداش کردم.با تشکر دوباره از صابر طهماسبی یه سوال از اساتید داشتم :من کد زیر رو نوشتم که از توی اون رشته که دادم لینک رو جدا کنه.منتها خروجی برنامه ام چیزی که می خوام نبست.چیکار باید بکنم که اطلاعات بین دو تا تگ باز و بسته لینک رو کامل در یه خونه آرایه داشته باشم.اگر بشه که توی یه متغیر فقط رشته محتوی اطلاعات لینک باشه که چه بهتر.
لطفا راهنمایی بفرمایید.ممنونم

<?php
$contents = "this is the link<a href='http://www.ask.com' title='go to web search engine'>www.ask.com</a>end of example string";
print_r(preg_split("@(<a)(.*)(</a>)$@",$contents));
?>


اینم خروجی :
Array ( [0] => this is the linkwww.ask.com (http://www.ask.com/)end of example string )
من می خوام که اطلاعات بین دو تا تگ باز و بسته فقط نمایش داده بشه یا در متغیری قرار بگیره.


سلام
خوب همانطور که خروجی نشون میده کد شما اطلاعات رو گرفته و تو آرایه گذاشته مشکل چیه؟

ali zi zeperto
جمعه 19 شهریور 1389, 07:49 صبح
سلام
خوب همانطور که خروجی نشون میده کد شما اطلاعات رو گرفته و تو آرایه گذاشته مشکل چیه؟
من می خوام تو یه خونه آرایه ام href='http://www.ask.com باشه ولی توی خروجی من اصلا معلوم نیست اون قسمت با آدرس http و وبش کجا رفته!.شایدم اومده.چون مرورگر موقع خروجی www.ask.com رو بصورت لینک نشون میده.خلاصه گیج شده ام.الان اگه بخوام اون یه تیکه رو بصورت یه رشته تو یه خونه آرایه بگیرم این کد درسته؟با این الگو هم فکر می کنم باید میومد اما معلوم نیست کجاست!

sama01
جمعه 19 شهریور 1389, 09:53 صبح
دوست عزیز
من یه خواهشی دارم از شما.
لطف کنید رشته‌ی اصلی را بنویسید و در کنارش بگید که خروجی مورد انتظار شما باید دقیقا چی باشه.
با این توضیحاتی که شما می‌دید، قضیه داره پیچیده‌تر می‌شه.

$ M 3 H R D A D $
جمعه 19 شهریور 1389, 13:19 عصر
سلام آقای طهماسبی
من میخوام چک کنم متن یک تکست فارسی هست یا نه
فیلد من فیلد آدرس هست که ممکنه خط فاصله / یا اسلش یا خط تیره یا آندرلاین داشته باشه
میشه کدتونو برای این فیلد تغییر بدید ممنون میشم

ali zi zeperto
شنبه 20 شهریور 1389, 13:01 عصر
دوست عزیز
من یه خواهشی دارم از شما.
لطف کنید رشته‌ی اصلی را بنویسید و در کنارش بگید که خروجی مورد انتظار شما باید دقیقا چی باشه.
با این توضیحاتی که شما می‌دید، قضیه داره پیچیده‌تر می‌شه.
چشم.:لبخندساده:این رشته
."this is the link<a href='http://www.ask.com' title='go to web search engine'>www.ask.com</a>end of example string";
اینم خروجی که من دوست دارم بگیرم.البته این ایده آلشه.ازکدی که نوشتم چنین انتظاری ندارم
href='http://www.ask.com'
من از کدی که نوشتم انتظار خط زیر رو داشتم که تویه یه خونه آرایه قرار بگیره.
href='http://www.ask.com' title='go to web search engine'>www.ask.com (http://www.ask.com)
بعد می خوام از روی این رشته یا رشته هایی که بدست میارم دوباره روشون کار کنم و اون خروجی ایده آله رو بگیرم.
البته درخوااست کد هم ندارم.این ایده آلش رو گفتم که اگر احیانا راه بهتری برای پیدا کردنش هست ر صورت امکان اشاره بفرمایید و ایراد اون قطعه کدی که نوشتم رو بگید که چرا اون چیزی که من انتظار دارم خروجی نم یده؟
ممنون

sama01
شنبه 20 شهریور 1389, 21:38 عصر
خوب.
بالاخره این هم درست شد.

preg_match_all('/(<a href=("\S*")(\s.*)*>.*a>)/i',$str, $match);


البته در این کد، من فرض را بر این گذاشتم که شما href را بین " قرار می‌دهید. اگر خواستید از ' استفاده کنید، می‌توانید " را به ' تغییر دهید.
مقدار مورد نیازتان هم در $match[2] ذخیره شده است.

$ M 3 H R D A D $
جمعه 26 شهریور 1389, 20:41 عصر
sلام آقا صابر
عزیز من توی صفحه اچ تی ام ال کاراکتر و رو utf8 تنظیم کردم
توی فایل reg.php هم توی قالب اچ تی ام ال با کاراکتر utf8

کد شما و توی notepad با یونیکد utf ذخیره میکنم به اینکه توی ورودی عدد باشه گیر نمیده اما وقتی توی سایتم از فرمم مقدار میاد به عدد حساسه میشه کمک کنید ؟

$ M 3 H R D A D $
جمعه 26 شهریور 1389, 20:53 عصر
خیابان شریعتی4

این عبارت و میدم میگه درسته اما عبارت پست قبلی (خیابان طالب آملی کوچه دریایی ۴۲ پلاک ۲) و میگه لطفا فارسی وارد کنید

sama01
شنبه 27 شهریور 1389, 13:50 عصر
از چه patternی استفاده می‌کنید؟

$ M 3 H R D A D $
سه شنبه 06 مهر 1389, 22:18 عصر
از چه patternی استفاده می‌کنید؟




echo preg_match("#^[\s\x{0621}-\x{063A}\x{0640}-\x{0691}\x{0698}-\x{06D2}0-9]*$#u",'دوست خوب');

mohmadd
چهارشنبه 07 مهر 1389, 00:34 صبح
از کد زیر استفاده کنید مطمئنا مشکل حل خواهد شد.


echo preg_match("#^[\s\x{0621}-\x{063A}\x{0640}-\x{0691}\x{0698}-\x{06D2}\x{06F0}-\x{06F9}\x{0661}-\x{0669}0-9\n\r]+$#u",'کوچه دریایی ۴۲ پلاک ۲');
در ضمن کد یه مشکلی داشت که به جای + از * استفاده کرده بود

$ M 3 H R D A D $
چهارشنبه 07 مهر 1389, 09:36 صبح
ممنون مشکل حل شد
میخوام نقطه و / و - و _ \ و مجازکنم میشه تغییرات بدید؟:عصبانی++:

mohmadd
چهارشنبه 07 مهر 1389, 16:43 عصر
echo preg_match("#^[\s\x{0621}-\x{063A}\x{0640}-\x{0691}\x{0698}-\x{06D2}\x{06F0}-\x{06F9}\x{0661}-\x{0669}0-9\n\r\\/\-\_\.]+$#u",'کوچه دریایی ۴۲ پلاک ۲');

sargardoon
یک شنبه 15 اسفند 1389, 17:41 عصر
من این عبارت رو زدم


echo preg_match("#^[\s\x{0621}-\x{063A}\x{0640}-\x{0691}\x{0698}-\x{06D2}0-9]*$#u",'دوست خوب');

echo preg_match("#^[\s\x{0621}-\x{063A}\x{0640}-\x{0691}\x{0698}-\x{06D2}0-9]*$#u",'د');

echo preg_match("#^[\s\x{0621}-\x{063A}\x{0640}-\x{0691}\x{0698}-\x{06D2}0-9]*$#u",'ا');

echo preg_match("#^[\s\x{0621}-\x{063A}\x{0640}-\x{0691}\x{0698}-\x{06D2}0-9]*$#u",'ن');

نتیجه شد

0000

من از ویندوز xp و xampp استفاده میکنم و نتیجه شد 1111
با چندتا حروف دیگه هم امتحان کردم کار میکرد. اگر به غیر از حروف باشه رو 0 میده

tux-world
یک شنبه 15 اسفند 1389, 20:20 عصر
.
.
.
echo preg_match("#^[\s\x{0621}-\x{063A}\x{0640}-\x{0691}\x{0698}-\x{06D2}0-9]*$#u",'ن'); [/PHP]

نتیجه شد

0000
من رو لینوکس apache که برنامه نویسی php میکنم تست کردم ۱ جواب گرفتم. ویندوز چون نداشتم دیگه تستش با بقیه. چون هم رو لینوکس و هم apache تست کردم جواب مطمئن تر از ماله بقیه دوستان ویندوزی باشه. شاید xampp نسخه قدیمیش باشه ؟

alirayaneh
سه شنبه 02 فروردین 1390, 12:46 عصر
سلام محمد جان

من کدی که شما قرار دادید رو برای جدا کردن کلمات فارسی بکار بردم اما علاوه بر کلمات فارسی کارکتر ها لاتین و علائم < و > / و _ - و * رو هم جدا کرد
words=preg_split("#^[\s\x{0621}-\x{063A}\x{0640}-\x{0691}\x{0698}-\x{06D2}\x{06F0}-\x{06F9}\x{0661}-\x{0669}0-9\n\r]+$#u","$string");


من میخوام محتوای یه فایل html رو پس از بازکردن توی برنامه فقط کلمات فارسی رو جدا کنه هیچگونه کارکتر غیر فارسی توی برنامه نباشه


یا صلا اگر هم قرار کلمه لاتینی توی برنامه باشه فقط کلمات مربوط به متن باشه نه حروف و یا کارکتر های مربوط به تگ های html مثلا td یا tr یا div یا textarea اینها کارکتر های لاتین هستن اما مربوط به تگ های اچ تی ام ال هستند

برای مثال ما جمله زیر رو داریم و میخوایم

<br>
سلام بچه ها
لطفا نام خود را در فیلد زیر وارد کنید
<br />
<input type='text' id='name'>d

رشته مورد نظر ما

سلام بچه ها لطفا نام خود را در فیلد زیر وارد کنید

satan_905
دوشنبه 23 آبان 1390, 15:25 عصر
echo preg_match("#^[\s\x{0621}-\x{063A}\x{0640}-\x{0691}\x{0698}-\x{06D2}0-9]*$#u",'دوست خوب');
میشه در مورد این عبارت منظم بیشتر توضیح بدهید

u آخر عبارت منظم برای چیست؟


با تشکر

satan_905
یک شنبه 29 آبان 1390, 13:22 عصر
echo preg_match("#^[\s\x{0621}-\x{063A}\x{0640}-\x{0691}\x{0698}-\x{06D2}0-9]*$#u",'دوست خوب');
میشه در مورد این عبارت منظم بیشتر توضیح بدهید

u آخر عبارت منظم برای چیست؟


با تشکر


از اساتید کسی نیست جواب من رو بده؟؟؟؟؟؟؟؟

iraitc
سه شنبه 06 تیر 1391, 16:40 عصر
گند زدید به این تاپیک همتون .
مثلا داشت بنده خدا آموزش میداد.
اینجا قرار بود آموزش ریجکس بدن نه مشکلاتتون رو رفع کنن.
کل آموزش رو ول کردید چسبیدید به همون یه تیکه اعتبار سنجی فارسیش ، خوب از تابع جاوا اسکریپت برای تایپ فارسی استفاده کنید.
تو اینترنت جستجو کنید یه عالمه وجود داره .

asonline
شنبه 07 دی 1392, 10:58 صبح
از آقای صابر طهماسبی بسیار تشکر میکنم بابت این تاپیک و ازشون میخوام در مورد تابع preg_match_all توضیحات کاملی رو بگن