Defis znotraj nizov v regularnih izrazih PHP

Defis - tudi poseben znak znotraj [] (zunaj - pa ne). Če potrebujete sam defis kot simbol - ga postavite tja, kjer ne bo razumljen kot ločilo skupine.

Zakaj je to pomembno: lahko nenamerno ustvarite skupino simbolov. Na primer, tako - [:-@] - mislite, da izbirate dvopičje, defis in znak @, v resnici pa dobite skupino simbolov med : in @. V to skupino spadajo naslednji simboli: :, ;, ?, <, =, >.

Od kod so prišli? Iz tabele ASCII - dvopičje ima manjšo številko kot znak @ - in tako nastane skupina. To pomeni, da so vse skupine določene po ASCII tabeli (po želji lahko to uporabite).

Kako se s tem spopasti: postavite simbol defisa tja, kjer zagotovo ne bo razumljen kot simbol skupine, na primer, na začetku ali na koncu (to je po [ ali pred ]).

Defis lahko tudi escapirate - potem bo pomenil sam sebe ne glede na položaj. Na primer, namesto [:-@] napisati [:\-@] - in skupine ne bo več, ampak bodo trije simboli - dvopičje, defis in znak @.

Primer

V naslednjem primeru je vzorec iskanja tak: številka 1, nato črka od 'a' do 'z', nato številka 2:

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

Kot rezultat se bo v spremenljivko zapisalo naslednje:

php'! 1-2 ! !'

Primer

Zdaj pa escapirajmo defis. Kot rezultat je vzorec iskanja tak: številka 1, nato črka 'a', ali defis, ali črka 'z', nato številka 2:

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

Kot rezultat se bo v spremenljivko zapisalo naslednje:

php'! ! 1c2 !'

Primer

Defis lahko preprosto prestavimo, ne da bi ga escapirali:

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

Kot rezultat se bo v spremenljivko zapisalo naslednje:

php'! ! 1c2 !'

Primer

V naslednjem primeru je vzorec iskanja tak: prvi simbol - to so male črke ali defis '-', nato dve črki 'x':

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

Kot rezultat se bo v spremenljivko zapisalo naslednje:

php'! Axx ! @xx'

Primer

V naslednjem primeru je vzorec iskanja tak: prvi simbol - to so male, velike črke ali defis '-', nato dve črki 'x':

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

Kot rezultat se bo v spremenljivko zapisalo naslednje:

php'! ! ! @xx'

Primer

Defis lahko postavimo med dve skupini - tam zagotovo ne bo naredil še ene skupine:

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

Kot rezultat se bo v spremenljivko zapisalo naslednje:

php'! ! ! @xx'

Praktične naloge

Задание 1

Podan niz:

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

Poiščite vse nize po naslednjem vzorcu: črka 'x', velika ali mala črka ali defis, črka 'z'.

Задание 2

Podan niz:

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

Poiščite vse nize po naslednjem vzorcu: črka 'x', nato ali dolar, ali defis ali plus, nato črka 'z'.