Hướng dẫn dùng re.replace trong PHP

Cú pháp

Cú phápstr_replace($search, $replace, $subject);

Hướng dẫn dùng re.replace trong PHP

Hướng dẫn dùng re.replace trong PHP

Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Trong đó:

  • $search là kí tự, chuỗi kí tự hoặc mảng các chuỗi ký tự cần tìm kiếm để thay thế.
  • $replace là kí tự, chuỗi kí tự hoặc mảng các chuỗi ký để thay thế cho kí tự, chuỗi kí tự hoặc mảng các chuỗi ký $sreach.
  • $subject là chuỗi ký tự hoặc mảng các chuỗi ký tự gốc cần được chỉnh sửa.

    Hàm str_replace() sẽ thay thế tất cả các ký tự $strSearch nằm trong $subject bằng ký tự $strReplace.

Mô tả

  • Nếu $search$replace là các mảng , str_replace() sẽ lấy từng phần tử của mảng để tìm kiếm và thay thế chúng trong chuỗi $subject.
  • Nếu $replace có ít phần tử hơn $search thì những chuỗi rỗng sẽ được sử dụng như là giá trị thay thế.
  • Nếu $search là 1 mảng và $replace là 1 chuỗi thì giá trị chuỗi $replace sẽ được thay thế cho mọi phần tử trong array $search.
  • Nếu $search$replace là các mảng các phần tử sẽ được xử lý từ đầu đến cuối.

Kết Quả trả về

Kết quả trả về của hàm str_replace() là một chuỗi hoặc 1 mảng với các ký tự đã được thay thế so với mảng ban đầu.

Bài viết này được đăng tại [free tuts .net]

Ví dụ

$search, $replace, $subject đều là chuỗi(string):

Code

$result	= str_replace('lap trinh', 'php', 'hoc lap trinh tai freetuts.net');
echo $result;

kết quả

hoc php tai freetuts.net

chuỗi 'lap trinh' đã được thay thế bằng chuỗi 'php'.

$search, $replace, $subject đều là mảng:

Code

$subject = ['toi', 'dang', 'hoc lap trinh', 'tai freetuts.net'];
$search = ['toi', 'dang', 'hoc lap trinh'];
$replace   = ['ban', 'co', 'hoc php'];
$result = str_replace($search, $replace, $subject);
echo "<pre>";
   print_r($result);
echo "</pre>";

Kết quả

Array
(
	[0] => ban
	[1] => co
	[2] => hoc php
	[3] => tai freetuts.net
)

các phần từ trong mảng $search lần lượt được tìm kiếm và thay thế bằng các phần tử trong mảng $replace.

$search là array, $replace là chuỗi:

Code

$subject = 'toi dang hoc, nghien cuu lap trinh tai freetuts.net';
$search = ['hoc', 'nghien cuu'];
$replace   = 'hoc tap';
$result = str_replace($search, $replace, $subject);
echo $result;

Kết quả

toi dang hoc tap, hoc tap lap trinh tai freetuts.net

tất cả các phân tử trong mảng $search đều được thay thế bằng chuỗi $replace.

$replace có ít phần tử hơn $search:

Code

$subject = 'toi dang hoc, nghien cuu lap trinh tai freetuts.net';
$search = ['hoc', 'nghien cuu', 'lap trinh'];
$replace   = ['learn', 'research'];
$result = str_replace($search, $replace, $subject);
echo $result;

Kết quả

toi dang learn, research  tai freetuts.net

bạn có thể thấy phần tử thứ 3 của mảng $search có giá trị 'lap trinh' đã bị thay thế bằng 1 khoảng trắng, 

Kết luận: qua các ví dụ trên hi vọng các bạn đã nắm được định nghĩa và cách xử dụng trong từng trường hợp của hàm str_replace().

Trong bài này chúng ta tìm hiểu một hàm khá giống với hàm str_replace đó là hàm preg_replace.

Hướng dẫn dùng re.replace trong PHP

Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

1. Hàm preg_replace trong PHP

Hàm preg_replace dùng để replace một chuỗi nào đó khớp với đoạn Regular Expression truyền vào. Hàm này có chức năng tương tự như str_replace nhưng có sự khác biệt là một bên dùng regex một bên không dùng.

Cú pháp: preg_replace ( $pattern, $replacement, $subject)

Trong đó:

Bài viết này được đăng tại [free tuts .net]

  • $partern: là chuỗi Regular Expression
  • $replacement: là chuỗi replace thành
  • $subject: là string muốn duyệt và replace

Kết quả trả về của hàm preg_replace là chuỗi đã được replace.

2. Ví dụ hàm preg_relace trong PHP

Ví dụ 1: Replace chuỗi hi thành chuỗi hello trong chuỗi hi everybody, hi there

$partern = '/hi/';
$subject = 'hi everybody, hi there';
$replacement = 'hello';
echo preg_replace($partern, $replacement, $subject);

Kết quả xuất ra màn hình là chuỗi hello everybody, hello there đã được replace

Ví dụ 2: Xóa thẻ h2 trong chuỗi <h2>Welcome to freetuts.net</h2>

Nhận xét: Ta thấy để xóa thẻ h2 thì sẽ phải replace cho cả thẻ đóng </h2> và thẻ mở <h2> thành ký tự trống ''. Ta sẽ có 2 cách xử lý cho bài này.

Cách 1: Dùng toán tử OR trong Regular Expression, tức là sẽ kiểm tra nếu là thẻ đóng hoặc thẻ mở thì sẽ bị replace thành ký tự trống. Chuỗi regex sẽ như sau $partern = '/(<h2>)|(<\/h2>)/'. Tôi đã dùng dấu mở và đóng () để gộp 2 nhóm thẻ mở và thẻ đóng lại, luôn luôn làm như vậy nha các bạn.

$partern = '/(<h2>)|(<\/h2>)/';
$subject = '<h2>Welcome to freetuts.net</h2>';
$replacement = '';
echo preg_replace($partern, $replacement, $subject);

Các bạn chạy lên và dùng firebug soi sẽ thấy mất thẻ h2.

Cách 2: Dùng toán tử kiểm tra có hoặc không đó là dấu ?. Bạn quay lại bài trước để xem các ví dụ và cách dùng dấu này nhé.

Các bạn thấy thẻ mở <h2> và thẻ đóng </h2> chỉ khác nhau ở chỗ dấu /. Như vậy chuỗi partern sẽ như sau $partern = '/(<\/?h2>)/'. Vì dấu / là ký tự đặc biệt trong Regular Expression nên tôi đã thêm một dấu \ để đặt trước nó. Những điều này tôi đã nói ở bài trước rồi nên bạn quay lại xem nhé. Dấu ? là có ý nghĩa có hoặc không có ký tự, tức là <h2> hoặc </h2>

$partern = '/(<\/?h2>)/';
$subject = '<h2>Welcome to freetuts.net</h2>';
$replacement = '';
echo preg_replace($partern, $replacement, $subject);

Chạy lên kết quả tương đương như cách 1.

Ví dụ 3: Dùng Regular Expression xóa tất cả những thẻ html (h2, h2, h3, h4, h5) của một đoạn text

Nếu không dùng hàm preg_replace kết hợp với Regular Expression thì trong php có cung cấp 1 hàm để xử lý vấn đề này, đó là hàm strip_tags. Nhưng trong đề bài yêu cầu dùng Regular Expresision nên phải làm vậy thôi.

Ý tưởng: Ở ví dụ 2 ta đã xóa được một thẻ h2, như vậy muốn xóa các thẻ khác thì chỉ cần copy và thay đổi giá trị thẻ là được, cách làm như sau:

$subject = '<h2>This is h2</h2><h2>This is h2</h2><h3>This is h3</h3><h4>This is h4 </div><h5> This is h5 </h5>';
// H1
$subject = preg_replace('/<\/?h2>/', '', $subject);
// H2
$subject = preg_replace('/<\/?h2>/', '', $subject);
// H3
$subject = preg_replace('/<\/?h3>/', '', $subject);
// H4
$subject = preg_replace('/<\/?h4>/', '', $subject);
// H5
$subject = preg_replace('/<\/?h5>/', '', $subject);

echo $subject;

Nhưng các bạn thấy liệu có hay không? có cách này để đưa vào một partern mà xử lý hết các thẻ luôn hay không? Câu trả lời là có nhé. Bạn kết hợp ví dụ 1 và ví dụ 2 lại sẽ có được chuỗi partern mong muốn. Các bạn xem bài giải sau:

$subject = '<h2>This is h2</h2><h2>This is h2</h2><h3>This is h3</h3><h4>This is h4 </div><h5> This is h5 </h5>';
echo preg_replace('/(<\/?h2>)|(<\/?h2>)|(<\/?h3>)|(<\/?h4>)|(<\/?h5>)/', '', $subject);

Rất gọn đúng không nào, các bạn tham khảo thêm một cách giải nữa:

$subject = '<h2>This is h2</h2><h2>This is h2</h2><h3>This is h3</h3><h4>This is h4 </div><h5> This is h5 </h5>';
echo preg_replace('/<\/?h(1|2|3|4|5)>/', '', $subject);

Cách này tôi dùng toán tử OR cho các số 1 hoặc 2 hoặc 3 hoặc 4 hoặc 5. Đây là cách gọn và tối ưu nhất đúng không nào.

3. Lời kết

Qua 3 ví dụ trên chắc hẳn bạn đã biết các sử dụng hàm preg_replace trong php kết hợp với Regular Expression rồi nhỉ. Có rất nhiều bài toán khác nhau và ứng dụng khác nhau nên không thể quy ra một công thức chung được, các bạn cố gắng nắm vững các biểu thức Regular Expression để kết hợp là ok.