جستجو در بخش : سوال جواب منابع اسلامی لغت نامه ها قوانین و مصوبات نقل قل ها
×

فرم ورود

ورود با گوگل ورود با گوگل ورود با تلگرام ورود با تلگرام
رمز عبور را فراموش کرده ام عضو نیستم، می خواهم عضو شوم
×

×

آدرس بخش انتخاب شده


جهت کپی کردن میتوانید از دکمه های Ctrl + C استفاده کنید
رویداد ها - امتیازات
در حال بارگذاری
×

رویداد ها - امتیازات

برای بررسی عملکرد فعالیت و امتیازات خود باید در وب سایت وارد باشید. در صورت عضویت از بخش بالای صفحه وارد شوید، در غیر این صورت از دکمه پایین، مستقیم به صفحه ثبت نام وارد شوید.

×
×
کد تخفیف اسنپ تاکسی با 50% تخفیف! دریافت کد
×

دلیل درخواست بستن پست

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

نحوه استفاده از Lookbehind در موتور pcre چگونه است؟


1
0
1473

من یک رشته دارم به صورت زیر:

<?php
    $str = "this is a test test text";
?>

من نیاز دارم کلمه test رو match کنم در صورتی که قبلش a نباشه. (حتی فاصله-a هم نباید باشه). پس توی رشته ی بالا، من نیاز دارم دومین test رو match کنم. با توجه به سرچ هایی که انجام دادم ظاهرا باید از lookbehind استفاده بکنم ولی هرچقدر سعی می کنم نمی تونم پیادش بکنم. ایده ای دارید چطوری میتونم این کار رو انجام بدم؟ با تشکر

علمی برنامه-نویسی
ویرایش شده در 6 سال قبل
سوال شده در ساناز رضایی
1366 امتیاز

500 کاراکتر باقی مانده

2 جواب

6

پاسخ به روز شده

ساختار های lookaround توسط اکثر موتور های عبارات با قاعده پشتیبانی نمیشوند و در آن هایی که پشتیبانی می شوند هم نوع استفاده ی یکسانی ندارند. مثلا در NET. می توان از lookbehind ای با طول متغیر (variable-length lookbehind) استفاده کرد (مثل استفاده از شمارنده هایی چون ستاره *) اما در PCRE این فیچر وجود ندارد. برای به دست آوردن نتیجه ی دلخواه، شما دو راه دارید:

استفاده از lookbehind (همانطور که دنبالش بودید):

ریجکس:

(?<!a |a)test

کد PHP:

echo preg_replace('~(?<!a |a)test~', '***', 'this is a test test text');
// this is a test *** text

از آنجایی که محدودیت ذکر شده در PCRE وجود دارد نمی توان از (?<!a *)test استفاده کرد. اما ما می توانیم در PCRE از alternation استفاده کنیم و طرفین پایپ | را با یک طول ثابت نمایش دهیم. برای همین من در یک سمت آلترنیشن از کاراکتر a ای که به همراه فاصله می آید استفاده کردم و در طرف دیگر یک کاراکتر a قرار داده ام.


استفاده از فعل بک ترک SKIP :

ریجکس:

a *test(*SKIP)(*F)|test

کد PHP:

echo preg_replace('~a *test(*SKIP)(*F)|test~', '***', 'this is a test test text');
// this is a test *** text

فعل بک ترک SKIP در واقع به عنوان حذف کننده ی هر آنچه تا کنون پیمایش شده به کار می رود. هر چه قبل از این توکن بیاید match می شود ولی سریعا موتور از روی آن میپرد. این پریدن زمانی صورت می گیرد که ریجکسی در ادامه ی این فعل بیاید که منجر به "بک ترک" در پیمایش بشود. برای همین این فعل کنار فعل F یا همان FAIL می آید. FAIL موتور را مجبور میکند تا به مسیر های قبلی برگردد و انتخاب دیگری بکند. موتور به عقب می رود و فعل SKIP را می بیند. SKIP سیگنالی میفرستد که "مسیر فعلی را قبول کن ولی آن را در حافظه خروجی ذخیره نکن". موتور سیگنال را میگیرد و به ادامه ی پیمایش می پردازد.

من در طرف چپ آلترنیشن تمامی test هایی که بعد از a یا a با فاصله آمده اند را match می کنم و از طریق افعال استفاده شده به موتور می فهمانم که این رشته ها را در خروجی نمی خواهم. در عوض آنچه در سمت راست آلترنیشن می آید را برایم match کن.

ویرایش شده در 6 سال قبل
جواب داده شده در محمد آقانبی
196 امتیاز


امکانش هست لطفا به سوال دیگه ی من جواب بدید. ممنونم ــ ساناز رضایی در 6 سال قبل

500 کاراکتر باقی مانده


5

با سلام، جواب سوال شما توسط lookbehind با الگوی زیر قابل حل می باشد.

(?<!a )(?<!a)test
ویرایش شده در 6 سال قبل
جواب داده شده در نورالله رضایی
878 امتیاز


ممنونم ــ ساناز رضایی در 6 سال قبل

امکانش هست لطفا به سوال دیگه ی من جواب بدید. ممنونم ــ ساناز رضایی در 6 سال قبل

@ساناز.رضایی لطفا در زیر یک سوال یا پاسخ، کامنت مرتبط به یک سوال دیگر را درج نکنید. طبق مستندات لام تا کام، «سوالات پرسیده شده در وب سایت لام تا کام، توسط متخصصین مربوطه بررسی خواهند شد و نیازی به دوباره پرسیدن یک سوال و یا انتشار لینک آن در زیر دیگر پست ها نیست و این کار اصطلاحا اسپم کردن محسوب می‌شود.» ــ محدثه حامدی نسب در 6 سال قبل

500 کاراکتر باقی مانده


جواب شما
     
.....
×

×

جعبه لام تا کام


وب سایت لام تا کام جهت نمایش استاندارد و کاربردی در تمامی نمایشگر ها بهینه شده است.

تبلیغات توضیحی


عرشیان از کجا شروع کنم ؟
تغییر و تحول با استاد سید محمد عرشیانفر

تبلیغات تصویری


کپی