SORU
17 EYLÜL 2008, ÇARŞAMBA


Nasıl belirli bir sayıda karakter için en yakın kelime için PHP bir dize Kesecek?

Bir veritabanından bir metin bloğunu çeken bir kod parçacığını PHP ile yazılmış bir web sayfasında bir widget için gönderir. Orijinal metin bloğunu uzun bir makale ya da iki kısa bir cümle olabilir; ama bu widget için daha fazla görüntü alamıyorum,, 200 karakter. İsterdim substr() kesmek metni en fazla 200 karakter, ama sonuç olurdu keserek ortasında kelime, " asıl istediğim chop metin sonunda son . ben^>kelime200 karakter önce.

CEVAP
17 EYLÜL 2008, ÇARŞAMBA


wordwrap işlevini kullanarak. Maksimum genişliği gibi birden fazla satır metin, kelime sınırlarında kırma belirtilen bir böler. Ayrıldıktan sonra, sadece ilk satırı:

substr($string, 0, strpos(wordwrap($string, $your_desired_width), "\n"));

Bu oneliner ele gelmez bir şey metnin kendisi istenilen genişlik daha kısa olduğu durumdur. Uç durumunda, bu işi, tek bir şey gibi yapmalıdır:

if (strlen($string) > $your_desired_width) 
{
    $string = wordwrap($string, $your_desired_width);
    $string = substr($string, 0, strpos($string, "\n"));
}

Yukarıdaki çözüm erken eğer gerçek cutpoint önce bir yeni satır içeriyorsa, metin kesme sorunu var. Burada bu sorunu çözer bir versiyonu:

function tokenTruncate($string, $your_desired_width) {
  $parts = preg_split('/([\s\n\r] )/', $string, null, PREG_SPLIT_DELIM_CAPTURE);
  $parts_count = count($parts);

  $length = 0;
  $last_part = 0;
  for (; $last_part < $parts_count;   $last_part) {
    $length  = strlen($parts[$last_part]);
    if ($length > $your_desired_width) { break; }
  }

  return implode(array_slice($parts, 0, $last_part));
}

Ayrıca, burada PHPUnit bu testclass uygulanması test etmek için kullanılır:

class TokenTruncateTest extends PHPUnit_Framework_TestCase {
  public function testBasic() {
    $this->assertEquals("1 3 5 7 9 ",
      tokenTruncate("1 3 5 7 9 11 14", 10));
  }

  public function testEmptyString() {
    $this->assertEquals("",
      tokenTruncate("", 10));
  }

  public function testShortString() {
    $this->assertEquals("1 3",
      tokenTruncate("1 3", 10));
  }

  public function testStringTooLong() {
    $this->assertEquals("",
      tokenTruncate("toooooooooooolooooong", 10));
  }

  public function testContainingNewline() {
    $this->assertEquals("1 3\n5 7 9 ",
      tokenTruncate("1 3\n5 7 9 11 14", 10));
  }
}

DÜZENLEME :

Özel karakterler UTF8 'at' değil işlenmiş gibi. 'U' işlemek için normal ifade sonunda: . Ekle

$parts = preg_split('/([\s\n\r] )/u', $string, null, PREG_SPLIT_DELIM_CAPTURE);

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • GUN-TIME with Brandon

    GUN-TIME wit

    3 ŞUBAT 2009
  • lifeisforsharingDT

    lifeisforsha

    18 Mayıs 2011
  • Numberphile

    Numberphile

    15 EYLÜL 2011