Bài tập thực hành xử lý chuỗi trong php


bài tập thực hành php cơ bản 23/09/2015 Cùng chuyên mục

Các thao tác duyệt chuỗi - đổi thành chữ hoa - tách, cắt chuỗi theo điều kiện - tìm kiếm chuỗi...trong php

Duyệt chuỗi

Chuỗi là một mảng các ký tự do đó việc duyệt chuỗi như là duyệt mảng. Ký tự đầu tiên của chuỗi được đánh chỉ số 0 ( hay còn gọi là ofset 0 ) - vị trí của ký tự cuối cùng = chiều dài chuỗi - 1, các bạn cần ghi nhớ và phân biệt sự khác nhau giữa vị trí của ký tự trong chuỗi và chiều dài chuỗi để tránh nhầm lẫn ( theo thói quen tự nhiên, cứ hay gọi ký tự đầu tiên sẽ có vị trí 1 ).

Ký tự C h u i
Vị trí 0 1 2 3 4

(*) Chuỗi trong PHP không có ký tự kết thúc như C.

Bài tập 1: Duyệt chuỗi 'I am a student' và xuất ra chuỗi có dạng 'I-am-a-student'

Đáp Án
Phân tích:
Để duyệt chuỗi có thể sử dụng vòng lặp for - trước hết cần biết số lượng phần tử của chuỗi, sử dụng hàm strlen(). Tiếp theo, chuỗi xuất ra khác với chuỗi gốc ở chỗ: các khoảng trắng của chuỗi gốc được thay thế bằng dấu '-', bạn có thể sử dụng hàm str_replace() hoặc sử dụng duyệt chuỗi nhưng tốt hơn cứ thực hiện duyệt chuỗi rồi mới sử dụng hàm, với mục đích nắm vững căn bản.
//khai báo chuỗi
$str = 'I am a student';
//sao chép để sử dụng cho hàm str_replace()
$str_cp = $str; 
//tính chiều dài chuỗi
$n = strlen($str);
//duyệt chuỗi - thay thế ký tự ' ' thành '-'
for($i = 0; $i < $n; $i++)
{
	if($str{$i} == ' ')
	{
		$str{$i} = '-';
	}
}
//xuất chuỗi
echo $str;
//sử dụng hàm str_replace()
$str_cp = str_replace(' ', '-', $str_cp);
//xuất chuỗi đã xử lý bằng hàm str_replace()
echo $str_cp;

Bài tập 2: Xuất ra chuỗi có dạng 'Title Case' ( chữ cái đầu tiên của từ in hoa ) cho họ và tên nhập vào - tách ra tên và tên đệm. 

Đáp Án
//khai báo chuỗi
$str = 'tran vAn An';
//chuẩn hóa chuỗi
$str = strtolower($str);
//sao chép để sử dụng cho hàm ucwords()
$str_cp = $str; 
//tính chiều dài chuỗi
$n = strlen($str);
//ký tự đầu tiên chuyển thành chữ hoa
$str{0} = strtoupper($str{0});
$k = array(); //cac vi tri cua khoang trang trong chuoi
//duyệt chuỗi 
for($i = 1; $i < $n; $i++)
{
	//nếu đó là một ký tự trắng thì ký tự sau nó sẽ đổi thành ký tự hoa
	if($str{$i} == ' ')
	{
		$str{$i+1} = strtoupper($str{$i+1});
		$i++;
		$k[] = $i; 
	}	
}
if(count($k) > 1)
{
	$ten_dem = substr($str,$k[0],$k[1]);
	$ten = substr($str, $k[1]);
}
//xuất chuỗi
echo $str;
//xuat ten dem va ten
echo ' Ten : ',$ten,' ten dem: ',$ten_dem,' ';
//sử dụng hàm ucwords()
echo 'su dung ham uucwords: ',ucwords($str_cp);

Bài tập 3: Viết chương trình mô tả văn bản của một bức điện tín. Nhập liệu bao gồm 1 hay
nhiều dòng chứa một số từ, mỗi từ cách nhau khoảng trắng. In ra hóa đơn tính tiền với mỗi từ
giá 100 đồng, phí trả thêm 50 đồng cho từ dài quá 8 kí tự. Hóa đơn có dạng sau:
So tu: 10
So tu co kich thuoc binh thuong : 8 x 100 = 800 dong
So tu co kích thuoc > 8 ki tu : 2 x 150 = 300 dong
Tong cong : 1100 dong

Đáp Án

Phân tích: 
Bài này cần duyệt chuỗi - đã thành thục ở các ví dụ trên. Trong đó lưu ý:

+ Ký tự trắng phân tách các từ - dấu hiệu báo rằng đã hết một từ sang từ khác, do đó đếm số ký tự trắng sẽ biết được số từ - ngoại lệ: từ cuối cùng không có ký tự trắng

+ Để đếm số lượng ký tự của môt từ, sử dụng biến đếm tăng lên khi chạy vòng lặp cho đến khi nào gặp ký tự trắng - sau đó đặt lại giá trị cho biến đếm là 0 và nhảy tới bước lặp kế tiếp ( để không cộng dư cho biến đếm ký tự trắng ) - ngoại lệ: từ cuối cùng thì phải cộng thêm 1 ký tự và nhảy khỏi vòng lặp

print("Nhap vao noi dung thu tin: ");	
//khai báo chuỗi rỗng
$str = '';
$str = trim(fgets(STDIN));
//tính chiều dài chuỗi
$n = strlen($str);
//so tu cua thu tin
$num_word = 0;
//so tu co kich thuoc binh thuong
$num_normal_word = 0;
//so tu co kich thuoc vuot qua 8 ky tu
$num_exp_word  = 0;
//dem so ky tu
$num_char = 0;
for($i = 0; $i < $n; $i++)
{			
	//neu la ky tu trang ( da duyet xong 1 tu)
	if($str{$i} == ' ')
	{
		$num_word++;
		//neu so luong ky tu nho 9 ky tu ( < = 8)
		if($num_char < 9)
		{
			$num_normal_word++;
		}
		else
		{
			$num_exp_word++;
		}
		$num_char = 0;
		continue;
	}
	//neu la ky tu cuoi cung (duyet xong tu cuoi cung)
	elseif($i == ($n-1)) 
	{
		$num_word++;
		//do la tu cuoi cung nen phai cong them 1 ky tu
		if(($num_char + 1) < 9)
		{
			$num_normal_word++;
		}
		else
		{
			$num_exp_word++;
		}		
		break;
	}
	$num_char ++;
}
printf("So tu %d \n",$num_word);
printf("So tu co kich thuoc binh thuong %dx100 = %d dong\n", $num_normal_word, $num_normal_word*100);
printf("So tu co kich thuoc > 8 ky tu %dx150 = %d dong\n", $num_exp_word, $num_exp_word*150);
printf("Tong cong: %d dong\n", $num_normal_word*100 + $num_exp_word*150);

Bài tập 4: Một chuỗi có định dạng: [username:Tran Van A-age:18][username:Tran Van B-age:20] - hãy tách giá trị username, age thành 1 mảng có 2 khóa 'username', 'age' và xuất ra mảng đó.

Đáp Án
//khoi tao chuoi
$str = '[username:Tran Van A-age:18][username:Tran Van B-age:20]';
$str_arr = array();
//cat chuoi thanh 1 mang
$str_arr = explode('[',$str);
//mang xuat ra
$exp_arr = array();
foreach( $str_arr as $key)
{
	if($key != "")
	{
		//lay ra vi tri cua chuoi username:
		$pot_user_name = stripos($key,'username:');
		//lay ra vi tri cua ky tu '-'
		$pot_age = stripos($key,'-');		
		//cat chuoi cac ky tu sau vi tri username: cho toi vi tri cua ky tu -
		$user_name = substr($key,$pot_user_name + strlen('username:'),$pot_age - ($pot_user_name + strlen('username:')));
		//cat chuoi tu vi tri phia sau vi tri -age: cho toi n - 1 ( bo ky tu ] o cuoi chuoi )
		$age = substr($key,$pot_age + strlen('-age:'),strlen($key) - ($pot_age + strlen('-age:')+1));
		$exp_arr[] = array('user_name' => $user_name, 'age' => $age);
	}
}
//in ket qua
foreach ($exp_arr as $key)
{
	printf("User_Name: %s - Age: %s\n", $key['user_name'], $key['age']);
}

TỔNG KẾT

Sau bài này các bạn cần nắm được:

  • Cách thức duyệt một chuỗi - sử dụng các phép so sánh, các hàm với các ký tự chuỗi
  • Hiểu sâu cấu trúc chuỗi trong PHP
  • Kết hợp duyệt chuỗi và các hàm xử lý chuỗi
  • Nắm được các thông số truyền vào hàm xử lý chuỗi như vị trí, độ dài...

 




Bình luận:


xử lý chuỗi bài tập php