Dấu gạch ngang bên trong bộ ký tự trong regex PHP
Dấu gạch ngang - cũng là một ký tự đặc biệt bên trong []
(còn bên ngoài - thì không). Nếu bạn cần chính dấu gạch ngang như một ký tự - hãy đặt nó ở nơi
nó sẽ không bị hiểu là dấu phân cách
nhóm.
Tại sao điều này quan trọng: bạn có thể tạo ra một nhóm
ký tự mà không hề nhận ra. Ví dụ,
như thế này - [:-@] - bạn nghĩ rằng
bạn đang chọn dấu hai chấm, dấu gạch ngang và dấu @, nhưng thực tế
lại trở thành một nhóm ký tự giữa
: và @. Nhóm này bao gồm
các ký tự sau: :, ;, ?,
<, =, >.
Chúng từ đâu ra? Từ bảng ASCII - dấu hai chấm có số thứ tự nhỏ hơn dấu @ - và kết quả là một nhóm. Tức là tất cả các nhóm được hình thành dựa trên bảng ASCII (nếu muốn bạn có thể tận dụng điều này).
Cách xử lý: đặt ký tự dấu gạch ngang
ở nơi nó chắc chắn sẽ không bị hiểu là
ký tự nhóm, ví dụ, ở đầu hoặc ở cuối
(tức là sau [ hoặc trước ]).
Cũng có thể thoát dấu gạch ngang - khi đó
nó sẽ đại diện cho chính nó bất kể
vị trí. Ví dụ, thay vì [:-@] hãy viết
[:\-@] - và sẽ không có nhóm nữa, mà
sẽ là ba ký tự - dấu hai chấm, dấu gạch ngang và dấu @.
Ví dụ
Trong ví dụ tiếp theo, mẫu tìm kiếm như sau:
chữ số 1, sau đó là chữ cái từ 'a'
đến 'z', sau đó là chữ số 2:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a-z]2#', '!', $str);
?>
Kết quả, biến sẽ ghi lại nội dung sau:
'! 1-2 ! !'
Ví dụ
Bây giờ hãy thoát dấu gạch ngang. Kết quả
mẫu tìm kiếm như sau: chữ số 1, sau đó
là chữ cái 'a', hoặc dấu gạch ngang, hoặc chữ cái 'z',
sau đó là chữ số 2:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a\-z]2#', '!', $str);
?>
Kết quả, biến sẽ ghi lại nội dung sau:
'! ! 1c2 !'
Ví dụ
Có thể chỉ cần di chuyển dấu gạch ngang, không cần thoát nó:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[az-]2#', '!', $str);
?>
Kết quả, biến sẽ ghi lại nội dung sau:
'! ! 1c2 !'
Ví dụ
Trong ví dụ tiếp theo, mẫu tìm kiếm như sau:
ký tự đầu tiên - là chữ cái thường hoặc
dấu gạch ngang '-', sau đó là hai chữ cái 'x':
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-z-]xx#', '!', $str);
?>
Kết quả, biến sẽ ghi lại nội dung sau:
'! Axx ! @xx'
Ví dụ
Trong ví dụ tiếp theo, mẫu tìm kiếm như sau:
ký tự đầu tiên - là chữ cái thường, chữ hoa
hoặc dấu gạch ngang '-', sau đó là hai chữ cái
'x':
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-zA-Z-]xx#', '!', $str);
?>
Kết quả, biến sẽ ghi lại nội dung sau:
'! ! ! @xx'
Ví dụ
Có thể đặt dấu gạch ngang giữa hai nhóm - ở đó nó chắc chắn sẽ không tạo ra thêm một nhóm nữa:
<?php
$str = 'axx 9xx -xx @xx';
$res = preg_replace('#[a-z-0-9]xx#', '!', $str);
?>
Kết quả, biến sẽ ghi lại nội dung sau:
'! ! ! @xx'
Bài tập thực hành
Cho chuỗi:
<?php
$str = 'xaz xBz xcz x-z x@z';
?>
Tìm tất cả các chuỗi theo mẫu sau:
chữ cái 'x', chữ cái hoa
hoặc chữ thường hoặc dấu gạch ngang,
chữ cái 'z'.
Cho chuỗi:
<?php
$str = 'xaz x$z x-z xcz x+z x%z x*z';
?>
Tìm tất cả các chuỗi theo mẫu sau:
chữ cái 'x', sau đó là dấu đô la, hoặc
dấu gạch ngang hoặc dấu cộng, sau đó là chữ cái 'z'.