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

  • Learn Math Tutorials

    Learn Math T

    20 Kasım 2011
  • PCDIY

    PCDIY

    16 AĞUSTOS 2013
  • WestsideMrArO

    WestsideMrAr

    6 EKİM 2010