hn4u @ Last updated 21/11/04 22:42
Go to my homepage at http://4u.jcisio.com
Full version available at http://4u.jcisio.com/r/article1465.htm

Hải Nam

Tô màu cho mã lệnh PHP

Việc tạo định dạng đẹp cho một đoạn code trở nên dễ nhìn gọi là pretty code print, và hầu như tất cả các IDE đều hỗ trợ điều này. Để định dạng một đoạn code, các thao tác là: căn lề, chỉnh dòng, tô màu cho các thành phân khác nhau của đoạn mã. Đương nhiên, mỗi ngôn ngữ có các đặc trưng riêng, nhưng các trình soạn thảo chuyên nghiệp thường tạo một bộ văn phạm cho mỗi ngôn ngữ để từ đó định dạng.

Đối với PHP thì lại không cung cấp cho ta tuỳ chọn bộ văn phạm, mà chỉ cho ta định dạng chỉ mã PHP mà thôi, thông qua các hàm highlight_string()highlight_file(). Bài viết này sẽ giới thiệu cách sử dụng hai hàm đó.

Phần cơ bản

hightlight_file

Còn có tên khác là show_source(). Sử dụng hàm này rất đơn giản, cú pháp như sau:

CODE
mixed highlight_file ( string filename [, bool return])

filename chính là tên tập tin cần định dạng, còn return đặt bằng TRUE hàm sẽ trả về kết quả dưới dạng chuỗi, nếu không sẽ in thẳng ra màn hình.

Thí dụ:

CODE (php)
// hiển thị mã rồi xuất ra:
highlight_file('demo.php', false);

// lệnh tương đương:
$content = highlight_file('demo.php', true);
echo
$content;

Điều cần chú ý, là trước khi hiển thị nội dung file, nên cẩn thận với các mật khẩu trong đó (nếu bạn chưa xoá đi).

hightlight_string

Dùng để định dạng một đoạn mã, cú pháp tương tự:

CODE
mixed highlight_string ( string str [, bool return])

Biến nhập str vào sẽ là đoạn lệnh cần định dạng (thay vì filename như trong hàm trước). Giá trị return cũng có ý nghĩa tương tự.

Điều cần lưu ý là đoạn mã đó phải được kẹp bởi <?php ?> hoặc <? ?>. Bạn xem thử thí dụ sau:

CODE (php)
$s = "<?
phpinfo();
echo 'Test';
?>"
;
highlight_string($s, false);
highlight_string("<html>".$s."</html>", false);

Rõ ràng chỉ có phần trong <? ?> mới được tô màu. Do đó lệnh highlight_string("phpinfo();", false) sẽ không tô màu gì cả, mà nó xem như là HTML chứ không phải mã PHP (do tính chất nhúng chung PHP vào HTML).

Tuy xuất ra cùng kết quả trên màn hình, nhưng PHP4 dùng thẻ font để định dạng màu chữ, còn PHP5 dùng CSS với thẻ span.

Phần nâng cao

Hàm sau sẽ trả về đoạn mã được tô màu, kèm theo là đánh số theo dòng luôn:

CODE (PHP)
function color_code($code)
{
   
$code = $copy = substr_replace(substr_replace(highlight_string(stripslashes($code),true),'',0,28),'',-15,15);
   do   
   {   
       
$range = strchr($copy, '<font ');
       
$tagrange = substr($range,0,strlen($range) - strlen(strchr($range, '</font>')));
       
$br = strchr($tagrange, '<br />');
       if (
strlen($br)>0)
       {
           
$fulltag = substr($tagrange,0,strlen($tagrange) - strlen(strchr($tagrange, '>')));
           
$l_len = strlen($code) - strlen($range) + strlen($tagrange)+6;
           
$tag = $fulltag.'>';
       }
       while (
strlen($br)>0)
       {                       
           
$indexarray[] = $l_len-strlen($br);               
           
$tagarray[] = $tag;
           
$br = strchr($br=substr($br,6), '<br />');
       }
       
$copy = substr($range,1);
   } while (
strlen($copy)>0);
   
$max = count($tagarray);
   for (
$count=0;$count<$max;$count++)
   {
       
$code = substr_replace($code,$tagarray[$count], ($indexarray[$count]+$offby),0);   
       
$code = substr_replace($code,'</font>', ($indexarray[$count]+$offby-6),0);       
       
$offby += strlen($tagarray[$count])+7;                   
   }
   
$max = count($code = split('<br />', $code));
   for (
$count=0;$count<$max;$count++)
   {
       
$output .= '<tr><td align="right" valign="top">'.($count+1).'.</td><td>'.$code[$count].'</td></tr>';
   }
   return
'<table border="0" width="100%" cellspacing="0">'.$output.'</table>';
}


hainam4u @ Last updated 21/11/04 22:42
Go to my homepage at http://4u.jcisio.com