N karakter çok baytlı dize kesecek

3 Cevap php

Ben bir String Filtre çalışma bu yöntemi almak için çalışıyorum:

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

Ben beklerdim

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

ve aynı zamanda bu

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

İşte $chars eksi $terminator dize karakteridir.

Buna ek olarak, filtre, örneğin, $chars sınırın altında ilk kelime sınırından kesilir gerekiyordu

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

Bu adımları ile çalışması gerektiğini oldukça eminim

  • maksimum karakterlik sonlandırıcı karakter arasında substract miktarı
  • bu dize hesaplanmış sınırından daha uzundur doğrulamak veya değiştirilmemiş iade
  • kelime sınırını almak için hesaplanan sınırının altında dizesindeki son uzay karakteri bulmak
  • Hiçbir son uzay bulunursa eğer geçen boşluk veya hesaplanan limitte dize kesti
  • dize terminatör append
  • bir dize döndürür

Ancak, şimdi str* ve mb_* fonksiyonların çeşitli kombinasyonları denedim, ama hepsi yanlış sonuçlar vermiştir. Bu kadar zor olamaz, demek ki bir şey eksik. Birisi bu or Sonunda bunu nasıl anlayabiliriz bir kaynak bana gelin için çalışan bir uygulama paylaşmak istiyorum.

Teşekkürler

P.S. Evet, http://stackoverflow.com/search?q=truncate+string+php önce kontrol var :)

3 Cevap

Bu deneyin:

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;
}

Ama sizin dahili kodlamayı doğru ayarlanmış olduğundan emin olmanız gerekir.

Ben genellikle sadece bu gibi bir soruya bütün bir cevap kod sevmiyorum. Ama aynı zamanda ben uyandım, ve belki soru günün geri kalanı için program gitmek için iyi bir ruh hali beni düşündüm.

Bu çalıştırmayı deneyin vermedi, ama çalışması gerekir ya da en azından orada yol% 90 olsun.

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;
}