PHP тұрақты өрнектеріндегі жиындар ішіндегі дефис

Дефис - [] ішінде де арнайы таңба (ал сыртында - емес). Егер сізге дефис таңба ретінде қажет болса - оны топ бөлгіш ретінде қабылданбайтын жерге қойыңыз.

Бұл неге маңызды: сіз өзіңіз байқамастан таңбалар тобын жасай аласыз. Мысалы, осылай - [:-@] - сіз үтір, дефис және @ таңбаларын таңдайды деп ойлайсыз, бірақ шын мәнінде : пен @ арасындағы таңбалар тобы шығады. Бұл топқа мынадай таңбалар кіреді: :, ;, ?, <, =, >.

Олар қайдан шықты? ASCII кестесінен - үтірдің нөмірі @ таңбасына қарағанда кіші - сөйтіп топ пайда болады. Яғни барлық топтар ASCII кестесі бойынша алынады (қалауыңызша бұны пайдалануға болады).

Бұнымен қалай күресу керек: дефис таңбасын оның таңбалар тобы ретінде мүлдем қабылданбайтын жерге қойыңыз, мысалы, басында немесе соңында (яғни [-дан кейін немесе ]-дан бұрын).

Сондай-ақ дефісті экрандауға болады - онда ол орнына қарамастан өзін білдіреді. Мысалы, [:-@] орнына [:\-@] деп жазуға болады - және енді топ болмайды, ал үш таңба болады - үтір, дефис және @ таңбасы.

Мысал

Келесі мысалда іздеу үлгісі мынадай: 1 цифры, содан кейін 'a'-дан 'z'-ға дейінгі әріп, содан кейін 2 цифры:

php<?php
  $str = '1a2 1-2 1c2 1z2';
  $res = preg_replace('#1[a-z]2#', '!', $str);
?>

Нәтижесінде айнымалыға мынаны жазады:

php'! 1-2 ! !'

Мысал

Енді дефісті экрандайық. Нәтижесінде іздеу үлгісі мынадай: 1 цифры, содан кейін 'a' әрпі, немесе дефис, немесе 'z' әрпі, содан кейін 2 цифры:

php<?php
  $str = '1a2 1-2 1c2 1z2';
  $res = preg_replace('#1[a\-z]2#', '!', $str);
?>

Нәтижесінде айнымалыға мынаны жазады:

php'! ! 1c2 !'

Мысал

Дефісті экрандамай-ақ, орын ауыстыруға болады:

php<?php
  $str = '1a2 1-2 1c2 1z2';
  $res = preg_replace('#1[az-]2#', '!', $str);
?>

Нәтижесінде айнымалыға мынаны жазады:

php'! ! 1c2 !'

Мысал

Келесі мысалда іздеу үлгісі мынадай: бірінші таңба - бұл кіші әріптер немесе дефис '-', содан кейін екі 'x' әрпі:

php<?php
  $str = 'axx Axx -xx @xx';
  $res = preg_replace('#[a-z-]xx#', '!', $str);
?>

Нәтижесінде айнымалыға мынаны жазады:

php'! Axx ! @xx'

Мысал

Келесі мысалда іздеу үлгісі мынадай: бірінші таңба - бұл кіші, үлкен әріптер немесе дефис '-', содан кейін екі 'x' әрпі:

php<?php
  $str = 'axx Axx -xx @xx';
  $res = preg_replace('#[a-zA-Z-]xx#', '!', $str);
?>

Нәтижесінде айнымалыға мынаны жазады:

php'! ! ! @xx'

Мысал

Дефісті екі топтың арасына қоюға болады - онда ол сөзсіз тағы бір топ жасамайды:

php<?php
  $str = 'axx 9xx -xx @xx';
  $res = preg_replace('#[a-z-0-9]xx#', '!', $str);
?>

Нәтижесінде айнымалыға мынаны жазады:

php'! ! ! @xx'

Практикалық тапсырмалар

Задание 1

Мына жол берілген:

php<?php
  $str = 'xaz xBz xcz x-z x@z';
?>

Мына үлгі бойынша барлық жолдарды табыңыз: 'x' әрпі, үлкен немесе кіші әріп немесе дефис, 'z' әрпі.

Задание 2

Мына жол берілген:

php<?php
  $str = 'xaz x$z x-z xcz x+z x%z x*z';
?>

Мына үлгі бойынша барлық жолдарды табыңыз: 'x' әрпі, содан кейін не доллар, не дефис не плюс, содан кейін 'z' әрпі.