Myślnik wewnątrz zestawów w wyrażeniach regularnych PHP

Myślnik - również jest symbolem specjalnym wewnątrz [] (a na zewnątrz - nie). Jeśli potrzebujesz samego myślnika jako symbolu - umieść go tam, gdzie nie zostanie zinterpretowany jako separator grupowy.

Dlaczego to ważne: możesz utworzyć grupę symboli, samemu tego nie zauważając. Na przykład, tak - [:-@] - myślisz, że wybierasz dwukropek, myślnik i małpę, a w rzeczywistości otrzymujesz grupę symboli pomiędzy : i @. W skład tej grupy wchodzą następujące symbole: :, ;, ?, <, =, >.

Skąd się wzięły? Z tabeli ASCII - dwukropek ma mniejszy numer niż małpa - i otrzymujemy grupę. Oznacza to, że wszystkie grupy powstają na podstawie tabeli ASCII (w razie potrzeby można z tego korzystać).

Jak z tym walczyć: umieść symbol myślnika tam, gdzie na pewno nie zostanie zinterpretowany jako symbol grupy, na przykład na początku lub na końcu (czyli po [ lub przed ]).

Można również wyescapować myślnik - wtedy będzie on oznaczał sam siebie niezależnie od pozycji. Na przykład, zamiast [:-@] napisać [:\-@] - i grupy już nie będzie, a będą trzy symbole - dwukropek, myślnik i małpa @.

Przykład

W następnym przykładzie wzorzec wyszukiwania jest następujący: cyfra 1, następnie litera od 'a' do 'z', następnie cyfra 2:

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

W rezultacie do zmiennej zostanie zapisane następujące:

php'! 1-2 ! !'

Przykład

Teraz wyescapujmy myślnik. W rezultacie wzorzec wyszukiwania jest następujący: cyfra 1, następnie litera 'a', lub myślnik, lub litera 'z', następnie cyfra 2:

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

W rezultacie do zmiennej zostanie zapisane następujące:

php'! ! 1c2 !'

Przykład

Można po prostu przesunąć myślnik, nie escapując go:

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

W rezultacie do zmiennej zostanie zapisane następujące:

php'! ! 1c2 !'

Przykład

W następnym przykładzie wzorzec wyszukiwania jest następujący: pierwszy symbol - to małe litery lub myślnik '-', potem dwie litery 'x':

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

W rezultacie do zmiennej zostanie zapisane następujące:

php'! Axx ! @xx'

Przykład

W następnym przykładzie wzorzec wyszukiwania jest następujący: pierwszy symbol - to małe, duże litery lub myślnik '-', potem dwie litery 'x':

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

W rezultacie do zmiennej zostanie zapisane następujące:

php'! ! ! @xx'

Przykład

Można umieścić myślnik pomiędzy dwiema grupami - tam na pewno nie utworzy jeszcze jednej grupy:

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

W rezultacie do zmiennej zostanie zapisane następujące:

php'! ! ! @xx'

Zadania praktyczne

Задание 1

Dany jest ciąg:

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

Znajdź wszystkie ciągi według następującego wzorca: litera 'x', duża lub mała litera lub myślnik, litera 'z'.

Задание 2

Dany jest ciąg:

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

Znajdź wszystkie ciągi według następującego wzorca: litera 'x', następnie lub dolar, lub myślnik lub plus, potem litera 'z'.