2010-01-28 30 views
7

tôi đang cố gắng để có được phương pháp này trong một hoạt động Chuỗi Lọc:Truncate một String multibyte đến n chars

public function truncate($string, $chars = 50, $terminator = ' …'); 

tôi mong đợi này

$in = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWYXZ1234567890"; 
$out = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV …"; 

và cũng này

$in = "âãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝ"; 
$out = "âãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđ …"; 

Đó là $chars trừ các ký tự của chuỗi $terminator.

Ngoài ra, bộ lọc được cho là cắt ở ranh giới từ đầu tiên bên dưới giới hạn $chars, ví dụ:

$in = "Answer to the Ultimate Question of Life, the Universe, and Everything."; 
$out = "Answer to the Ultimate Question of Life, the …"; 

Tôi khá chắc chắn điều này sẽ làm việc với các bước sau

  • lượng trừ đi các ký tự trong terminator từ ký tự tối đa
  • Validate chuỗi đó là dài hơn giới hạn tính toán hoặc trả lại nó không thay đổi gì
  • tìm ký tự dấu cách cuối cùng trong chuỗi bên dưới giới hạn được tính để nhận ranh giới từ
  • cắt chuỗi ở không gian cuối cùng hoặc giới hạn được tính nếu không tìm thấy không gian cuối cùng
  • thêm terminator chuỗi
  • trở lại chuỗi

Tuy nhiên, tôi đã cố gắng kết hợp khác nhau của str*mb_* chức năng bây giờ, nhưng tất cả mang lại kết quả sai. Điều này không thể khó khăn như vậy, vì vậy tôi rõ ràng là thiếu một cái gì đó. Ai đó có thể chia sẻ triển khai hoạt động cho số này hoặc chỉ cho tôi một tài nguyên mà cuối cùng tôi có thể hiểu cách thực hiện.

Cảm ơn

P.S. Có, tôi đã kiểm tra https://stackoverflow.com/search?q=truncate+string+php trước :)

+0

Bạn có thể tìm thấy ['s ($ str) -> truncateSafely (50)'] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str.php#L246) hữu ích, như được tìm thấy trong [thư viện độc lập này] (https://github.com/delight-im/PHP-Str). – caw

Trả lời

3

Hãy thử điều này:

function truncate($string, $chars = 50, $terminator = ' …') { 
    $cutPos = $chars - mb_strlen($terminator); 
    $boundaryPos = mb_strrpos(mb_substr($string, 0, mb_strpos($string, ' ', $cutPos)), ' '); 
    return mb_substr($string, 0, $boundaryPos === false ? $cutPos : $boundaryPos) . $terminator; 
} 

Nhưng bạn cần phải chắc chắn rằng mã hóa nội bộ của bạn được thiết lập đúng cách.

+0

Doh, tôi đã cố gắng làm cho nó hoạt động từ ISO-8859-1. Thay đổi nó thành UTF-8 bây giờ. Cảm ơn Gumbo. Tôi chấp nhận điều này như là câu trả lời đúng bởi vì nó chứa đựng điều duy nhất tôi đã mất tích. – Gordon

0

Tôi thường không thích viết mã toàn bộ câu trả lời cho câu hỏi như thế này. Nhưng tôi cũng chỉ tỉnh dậy, và tôi nghĩ có lẽ câu hỏi của bạn sẽ giúp tôi có một tâm trạng tốt để tham gia chương trình trong suốt thời gian còn lại trong ngày.

Tôi đã không cố gắng để chạy điều này, nhưng nó sẽ làm việc hoặc ít nhất là giúp bạn có được 90% cách đó.

function truncate($string, $chars = 50, $terminate = ' ...') 
{ 
    $chars -= mb_strlen($terminate); 
    if ($chars <= 0) 
     return $terminate; 

    $string = mb_substr($string, 0, $chars); 
    $space = mb_strrpos($string, ' '); 

    if ($space < mb_strlen($string)/2) 
     return $string . $terminate; 
    else 
     return mb_substr($string, 0, $space) . $terminate; 
} 
5

Chỉ cần phát hiện ra PHP đã có một multibyte cắt ngắn với

  • mb_strimwidth - Nhận chuỗi cắt ngắn với chiều rộng nhất định

Nó không tuân theo ranh giới từ mặc dù. Nhưng tiện dụng dù sao đi nữa!

Các vấn đề liên quan