Կանոնավոր արտահայտությունների ագահությունը սահմանափակելը PHP-ում
Կանոնավոր արտահայտությունները լռելյայնորեն ագահ են: Սա նշանակում է, որ դրանք գրավում են առավելագույն հնարավոր թվով նիշեր:
Եկեք նայենք մի օրինակի: Ենթադրենք, մենք ունենք հետևյալ տողը:
<?php
$str = 'aeeex zzz x kkk';
?>
Ենթադրենք, այս տողում մենք ցանկանում ենք գտնել
'aeeex' ենթատողը հետևյալ կաղապարով. տառ
'a', ապա ցանկացած նիշ մեկ կամ ավելի անգամ,
ապա 'x' տառը:
<?php
$res = preg_replace('#a.+x#', '!', $str);
?>
Մենք ակնկալում ենք, որ արդյունքում փոփոխականի մեջ
կգրվի '! zzz x kkk' տողը: Սակայն,
դա այդպես չէ. փոփոխականի մեջ հայտնվում է
'! kkk' տողը:
Ամբողջ բանն այն է, որ մեր կանոնավոր արտահայտությունը փնտրում է բոլոր
նիշերը 'a' տառից մինչև 'x' տառը:
Բայց մեր տողում կան երկու 'x' տառ:
Ագահության պատճառով ստացվում է, որ կանոնավոր արտահայտությունը փնտրում է մինչև
վերջին x-ը, thereby capturing
այն, ինչ մենք չէինք ակնկալում:
Իհարկե, հաճախ հենց այդպիսի վարքագիծ է մեզ անհրաժեշտ: Բայց կոնկրետ այս դեպքում մենք կցանկանայինք չեղարկել ագահությունը և ասել կանոնավոր արտահայտությանը, որ այն փնտրի մինչև առաջին x-ը:
Ագահությունը սահմանափակելու համար անհրաժեշտ է կրկնության օպերատորից հետո դնել հարցականի նշան.
<?php
$res = preg_replace('#a.+?x#', '!', $str);
?>
Ագահությունը կարելի է սահմանափակել բոլոր կրկնության օպերատորներին,
ահա այսպես. *?, ??
և {}?:
Տրված է տողը.
<?php
$str = 'aba accca azzza wwwwa';
?>
Գրեք կանոնավոր արտահայտություն, որը կգտնի բոլոր տողերը,
որոնց եզրերում կան 'a' տառերը,
և կփոխարինի դրանցից յուրաքանչյուրը '!'-ով:
a տառերի միջև կարող է լինել ցանկացած նիշ (բացի
'a'-ից):