10/10/2018, 10:57

PHP cần giúp đỡ về chuẩn hóa họ tên tiếng Việt.

Mình đang làm code chuẩn hóa tên tiếng Việt. Viết hoa chữ đầu và các chữ khác viết thường. Cách của mình là dùng hàm lower chuyển tất cả về chữ thường và sau đó dùng upwords chuyển chữ đầu của mỗi từ thành chữ hoa, vấn đề là nếu là những chữ như Đào thì sẽ bị chuyển thành đàO chữ ko thành Đào, còn các chữ khác thì vẫn bình thường. lỗi hình như do các hàm này ko hỗ trợ utf-8 hay sao đấy. Đây là code của mình:

$Hoten= mb_strtolower($Hoten,"UTF-8");
$Hoten = ucwords ($Hoten);

Mong các bro giúp đỡ.
thuyduongcd viết 13:09 ngày 10/10/2018
Code:
<?php
function titleCase($string) {
$len=strlen($string);
$i=0;
$last= "";
$new= "";
$string=strtoupper($string);
while ($i<$len):
$char=substr($string,$i,1);
if (ereg( "[A-Z]",$last)):
$new.=strtolower($char);
else:
$new.=strtoupper($char);
endif;
$last=$char;
$i++;
endwhile;
return($new);
};
?>
zmt264 viết 13:07 ngày 10/10/2018
Được gửi bởi thuyduongcd
Code:
<?php
function titleCase($string) {
$len=strlen($string);
$i=0;
$last= "";
$new= "";
$string=strtoupper($string);
while ($i<$len):
$char=substr($string,$i,1);
if (ereg( "[A-Z]",$last)):
$new.=strtolower($char);
else:
$new.=strtoupper($char);
endif;
$last=$char;
$i++;
endwhile;
return($new);
};
?>
có 1 vấn đề nhỏ trong đoạn code của bạn

ereg function has been DEPRECATED as of PHP 5.3.0. Relying on this feature is highly discouraged.
http://php.net/manual/en/function.ereg.php
thuyduongcd viết 13:00 ngày 10/10/2018
Tôi chỉ gợi ý một phương pháp cơ bản như thế. Còn việc áp dụng là tùy hoàn cảnh từng người, không thể cứ kiểu "plug and play". Như thế thì còn học lập trình làm gì. Làm sao tôi biết người nào xài PHP 4,5 hay 6 mà viết code cho phù hợp.
Huống chi, việc xử lý DEPRECATED không phải là quá khó khăn. Trong PHP nếu 1 hàm bỏ đi thì sẽ có 1 hàm khác thay thế.
Từ trước tới nay trong những đoạn code tôi đưa ra thường có chứa rất nhiều lỗi, tôi cũng biết điều này nhưng tôi không sửa. Bởi vì, một là tôi không có nhiều thời gian, hai là tôi cũng muốn những người sử dụng cùng tham gia fix lỗi để có cơ hội tìm hiểu nó. Tôi chúa ghét những người chỉ biết copy & paste, xem lập trình như trò chơi xếp hình.
Tóm lại tất cả những code tôi đưa ra đều chỉ là ý tưởng tham khảo, việc áp dụng nó là phần của mỗi người,
zmt264 viết 13:01 ngày 10/10/2018
Được gửi bởi thuyduongcd
Tôi chỉ gợi ý một phương pháp cơ bản như thế. Còn việc áp dụng là tùy hoàn cảnh từng người, không thể cứ kiểu "plug and play". Như thế thì còn học lập trình làm gì.

Tôi chúa ghét những người chỉ biết copy & paste, xem lập trình như trò chơi xếp hình.


Tóm lại tất cả những code tôi đưa ra đều chỉ là ý tưởng tham khảo, việc áp dụng nó là phần của mỗi người,
Hóa ra bác có quan điểm như thế, vậy thì tôi cùng quan điểm với bác
luuanhquyen viết 13:00 ngày 10/10/2018
cảm ơn bạn thuyduongcd đã giúp đỡ, mình đã nghiên cứu code của bạn. Nhưng mình thấy code sau này là hay nhất nên post lên để nếu bạn nào cần thì áp dụng:

<?php
function mb_ucwords($str)
{
return mb_convert_case($str, MB_CASE_TITLE, "UTF-8");
}
$str="lưu anh quyền";
$str = mb_ucwords($str);
echo $str;
?>
hoadili viết 13:14 ngày 10/10/2018
mình cũng chuẩn hóa theo cách của các bạn nhưng phần dấu cách ở giữa không xử lý được,đây là code của mình
function stdName ($astr) {
// Chuẩn hóa xâu $astr theo định dạng tên người, tên địa danh
$retval = $astr;
//$retval = mb_convert_case($astr, MB_CASE_TITLE, "UTF-8");
// $astr ==> $retval
//xoa dau cach o dau
$length = strlen($retval);
while(substr($retval,0,1)==' ')
{
$retval = substr($retval,1,$length);
$length--;
}
//viết hoa kí tứ đầu
$retval = ucfirst($retval);
//xóa dấu cách ở cuỗi
$length = strlen($retval);
while(substr($retval,-1,1)=='')

{
$retval = substr($retval,0,$length-1);
$length--;
}
//Xóa dấu cách ở giữa

$length = strlen($retval);
for($i=0;$i< $length; $i ++){
$length = strlen($retval);
if(substr($retval,$i,1)==' '){
$flag = $i;
while(substr($retval,$flag,1)==' ')
$flag ++;
$retval = substr($retval,0,$i)." ".ucfirst(substr($retval,$flag,$length)) ;
}//end if

}//end for
$retval = mb_convert_case($retval,MB_CASE_TITLE,"UTF-8");
return $retval;
}
Bài liên quan
0