Тире в набори от символи в регулярни изрази на PHP
Тирето - също е специален символ вътре в []
(а отвън - не е). Ако имате нужда от самото
тире като символ - го поставете там,
където няма да бъде възприето като разделител
на група.
Защо това е важно: можете да създадете група
от символи, без самите да го забележите. Например,
ето така - [:-@] - вие мислите, че
избирате двоеточие, тире и знака @, а всъщност
се получава група от символи между
: и @. В тази група влизат
следните символи: :, ;, ?,
<, =, >.
Откъде са се взели? От таблицата ASCII - двоеточието има по-малък номер от знака @ - и се получава група. Тоест всички групи се получават според таблицата ASCII (ако желаете можете да използвате това).
Как да се борим с това: поставете символа тире
там, където със сигурност няма да бъде възприет като
символ на група, например, в началото или в края
(тоест след [ или преди ]).
Можете също да екранирате тирето - тогава
то ще означава самото себе си независимо от
позицията. Например, вместо [:-@] да напишете
[:\-@] - и вече няма да има група, а
ще има три символа - двоеточие, тире и знак @.
Пример
В следващия пример шаблонът за търсене е такъв:
цифра 1, след това буква от 'a'
до 'z', след това цифра 2:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a-z]2#', '!', $str);
?>
В резултат във променливата ще се запише следното:
'! 1-2 ! !'
Пример
Нека сега екранираме тирето. В резултат
шаблонът за търсене е такъв: цифра 1, след това
буква 'a', или тире, или буква 'z',
след това цифра 2:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a\-z]2#', '!', $str);
?>
В резултат във променливата ще се запише следното:
'! ! 1c2 !'
Пример
Можете просто да пренаредите тирето, без да го екранирате:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[az-]2#', '!', $str);
?>
В резултат във променливата ще се запише следното:
'! ! 1c2 !'
Пример
В следващия пример шаблонът за търсене е такъв:
първият символ - това са малки букви или
тире '-', след това две букви 'x':
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-z-]xx#', '!', $str);
?>
В резултат във променливата ще се запише следното:
'! Axx ! @xx'
Пример
В следващия пример шаблонът за търсене е такъв:
първият символ - това са малки, главни
букви или тире '-', след това две букви
'x':
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-zA-Z-]xx#', '!', $str);
?>
В резултат във променливата ще се запише следното:
'! ! ! @xx'
Пример
Можете да поставите тирето между две групи - там то със сигурност още няма да създаде друга група:
<?php
$str = 'axx 9xx -xx @xx';
$res = preg_replace('#[a-z-0-9]xx#', '!', $str);
?>
В резултат във променливата ще се запише следното:
'! ! ! @xx'
Практически задачи
Даден е низ:
<?php
$str = 'xaz xBz xcz x-z x@z';
?>
Намерете всички низове по следния шаблон:
буква 'x', главна или малка
буква или тире, буква 'z'.
Даден е низ:
<?php
$str = 'xaz x$z x-z xcz x+z x%z x*z';
?>
Намерете всички низове по следния шаблон:
буква 'x', след това или долар, или
тире или плюс, след това буква 'z'.