PHP ile Düzenli Metin Kesmek

Uzun yazıları kırptığımızda, son kelimenin kalan kısımı görünmez oluyor ve anlamsız bir kelime, bazende tek bir harf olabiliyor. Örneğin;

$icerik = ‘Uzun yazıları kırptığımızda, son kelimenin kalan kısımı görünmez oluyor ve anlamsız bir kelime bazende tek bir harf olabiliyor.’;

Yukarıdaki içeriği substr() fonksiyonu ile, 60 karakterle sınırlarsak çıktı; “Uzun yazıları kırptığımızda, son kelimenin kalan kısoluyor.

Düzenli bir metin bölme işlemi için PHP de 2 satır kod yazmamız yeterli olacaktır…

if( preg_match('/(.*?)\s/i', substr( $icerik, 60), $dizi) )
     $icerik = substr($icerik, 0, 60+strlen($dizi[0]));

Çıktı;

Uzun yazıları kırptığımızda, son kelimenin kalan kısımı

Eğer içeriğimiz sadece text değil, html de içerisyorsa bu durumda, html taglarını yazıdan temizlememiz gerekir…. O halde bu durumda kodlarımız;

$icerik = strip_tags($icerik);
if( preg_match('/(.*?)\s/i', substr( $icerik, 60), $dizi) )
    $icerik = substr($icerik, 0, 60+strlen($dizi[0]));

Daha da ileri gidelim, html kodlarını temizledikten sonra istemediğimiz boşluklar oluşur ve bu boşluklar metinin olduğundan daha kısa olmasına neden olur… Bu durumda kodlarımız;

$icerik = strip_tags($icerik);
$icerik = str_replace(array("\t","\r","\n"), ' ',$icerik);
$icerik_bol = explode(' ', $icerik); // metini bosluklara gore bolduk
$icerik = '';
for($i = 0; $i < count($icerik_bol); $i++) {
     if ($icerik_bol[$i] != '') // veri yok mu? Atla, varsa ekle
          $icerik .= trim($icerik_bol[$i]).' ';
}

if( preg_match('/(.*?)\s/i', substr( $icerik, 60), $dizi) )
    $icerik = substr($icerik, 0, 60+strlen($dizi[0]));

Bitti : )

14 Yorum

  1. Bu arada sitenizi inceledim, aslında içeriği bakımından Joomla kurmanız daha uygun olurdu diye düşünüyorum.

  2. 🙂

    Aslında 3 mesaj önce söylemiştim $message değişkeni için neyse çözülmesi önemliydi.

    Şunu deneyin;

    $message = str_replace(array('[img', '[/img]'), array('<img','</img>'), $message);
    $message = strip_tags($message);
    $message = str_replace(array("\t","\r","\n"), ' ',$message);
    $message_bol = explode(' ', $message); // metini bosluklara gore bolduk
    $message = ";
    for($j = 0; $j < count($message_bol); $j++) {
    	if ($message_bol[$j] != '') // veri yok mu? Atla, varsa ekle
    	$message .= trim($message_bol[$j]).' ';
    }
    
    1. Kodu denedim ama değişen birşey olmadı. 🙂
      Site joomla olabilir haklısınız ama joomla da forum yok.
      Aslında, http://gokceali.net isimli sitemin yazılımı ile de kurabilirim ama phpbb hoşuma gidiyor.
      Sıkıntı yaşadığım son husus yine sistemin kodları ile alakalı sanırım.
      bbcode olarak kullandığı alanlar siliyor ama arasındaki linkleri silmiyor sanırım.
      Sizin kodlar ile ben onları siliyorum ama uzunluk olarak verdiğim sınırdan düşüremiyorum. Sıkıntı bu.
      Bakalım deneye deneye halledecez sanırım 🙂
      Verdiğiniz destekler için çok teşekkürler.
      Sevgi ve saygılar.

      1. Şunu deneyin

        $metin_uzunluk = 200; // 200 harften sonrasini, bosluga gore kesecek
        /* mesaj icerigini temizle */
        $bbcode= "#\[([^\]]+?)(=[^\]]+?)?\](.+?)\[/\1\]#";
        $message = preg_replace($bbcode, "", $message);
        $message = strip_tags($message);
        $message = str_replace(array("\t","\r","\n"), ' ',$message);
        
        // icerik belirttigimiz sinirdan buyukse kes
        if( strlen($message)>$metin_uzunluk) 
        if( preg_match('/(.*?)\s/i', substr( $message, $metin_uzunluk), $dizi) ) // bosluk mevcut ise
        $message = substr($message , 0, $metin_uzunluk+(strlen($dizi[0])));
        
  3. Merhaba,

    board portal diye bir modül kurdum.
    Ana sayfada istediğim forumdan ID no ve uzunluk vererek mesajları listeliyorum. İşte burada istediğim kısmı eksik kodladıkları için mesajda fotoğraf falan varsa görünüyor. Ben ise sadece yazı görünmesini ve uzunlukların aynı olmasını istiyorum. Göz atmak isterseniz sitem: http://orkmes.com

    Ana sayfada göreceksiniz demek istediğim hususu.

    Çok sağolun.

    1. bu şekilde anlamam zor olur. Son verdiğiniz kodlarda $message değişkenine uygulayabilirsiniz.

      Ayrıca sanırım board sisteminde metin kesmek ile ilgili bir seçenek var ki şu kodlar mevcut.
      ———————————————————————————————————
      if (($text_length != 0) && (strlen($len_check) > $text_length))
      {
      $message = str_replace(array(“\n”, “\r”), array(”, “\n”), $row[‘post_text’]);
      $message = get_sub_taged_string($message, $row[‘bbcode_uid’], $maxlen);
      $posts[$i][‘striped’] = true;
      }
      else
      {
      $message = str_replace(“\n”, ‘ ‘, $row[‘post_text’]);
      }
      ————————————————————-

      doğru yerdemiyiz denemek için else den sonrası için şunu yapın, ilgili bölümü örnekliyorum.

      else
      {
       //$message = str_replace("\n", '', $row['post_text']);
         $message = str_replace(array("\n", "\r"), array('', "\n"), $row['post_text']);
         $message = get_sub_taged_string($message, $row['bbcode_uid'], 60);
         $posts[$i]['striped'] = true;
      }
      
      
      1. Size de zahmet veriyorum ama ne yazık ki olmadı.
        http://gokceali.net/haberler.php diye bir sayfam var.
        O sayfayı tasarlayan arkadaş dediğim sorunu şu kodlardan bir tanesi ile çözmüş. Tam hangisi bilemedim ama tam istediğim sonuç. Lakin ben uyarlayamadım gitti 🙁

        1. Kod:
        $page_content = preg_split(“//i”, $data[‘page_breaks’] == “y” ? nl2br(stripslashes($data[‘page_content’])) : stripslashes($data[‘page_content’]));

        2. Kod:
        $page_content = preg_replace(“//i”, “”, ($data[‘page_breaks’] == “y” ? nl2br(stripslashes($data[‘page_content’])) : stripslashes($data[‘page_content’])));

        Aslında mantığı aynı ama kısımda sanırım olay bitiyor. Bir de ==”y” ne demek acaba?

        Fikir olsun diye ekledim.

        Uğraşınız için hakkınızı helal edin.

        1. $page_content = preg_split(“//i”, $data[‘page_breaks’] == “y” ? nl2br(stripslashes($data[‘page_content’])) : stripslashes($data[‘page_content’]));

          Eğer içerikte sayfa kesme var ise enter kodlarını al, yok ise olduğu gibi göster. Kısaca bu işlemden önce kırpma yapılmış…

          Bu şekilde yardımcı olamam zira nerede ne yapmak istiyorsunuz, ilgili temada ilgili bölüm neresi görmem, bilmem gerekir. Kısaca siz ekrana basılan mesaj değişkenini bulup o mesajda kırpma işlemi uygulamanız gerekir.

          sistem BBCODE kullandığı için aşağıdaki işlemi mesajı ekrana basmadan uygulamanız lazım. yani mesajı ekrana nerede bastığınızı bulun ve işlemi değişkene uygulayın.

          $message = str_replace(array(“\n”, “\r”), array(”, “\n”), $message);
          $message = get_sub_taged_string($message, $row[‘bbcode_uid’], 60);

          1. Sevgili Admin,

            Bu konuya ait son mesajda yer alan en uzun kodlar ile işlemi hallettim.

            $message = strip_tags($message);
            $message = str_replace(array(“\t”,”\r”,”\n”), ‘ ‘,$message);
            $message_bol = explode(‘ ‘, $message); // metini bosluklara gore bolduk
            $message = ”;
            for($j = 0; $j < count($message_bol); $j++) {
            if ($message_bol[$j] != '') // veri yok mu? Atla, varsa ekle
            $message .= trim($message_bol[$j]).' ';
            }

            if( preg_match('/(.*?)\s/i', $text_length, $dizi) )
            $message = $text_length+strlen($dizi[0]);

            Üstteki gibi. Ama mesaj içeriğinde (http://orkmes.com/viewtopic.php?f=7&t=32) linkinin en önünde fotoğraf ekli. Fotoğrafı göstermemeyi başardım ama fotoğraf linkinin sayısı kadar metni yine göstermiyor. Tek bir nokta kaldı başarmak için. Son bir kez incelemenizi rica ederim.

            Teşekkürler.

  4. Siz PHPBB Forumda nerede kullanacaksınız kesilen metinleri?

    Verdiğiniz kodlarda

    if (($text_length != 0) && (strlen($len_check) > $text_length))
    {
    $message = str_replace(array(“\n”, “\r”), array(”, “\n”), $row['post_text']);
    $message = get_sub_taged_string($message, $row['bbcode_uid'], $maxlen);
    $posts[$i]['striped'] = true;
    }
    else
    {
    $message = str_replace(“\n”, ‘ ‘, $row['post_text']);
    }
    

    Mesajın alındığı yer var

    ayrıca eğer mesajların kırpılmasını istemiş iseniz (admin panelde ayarları var sanırım)

    if (($text_length != 0) && (strlen($len_check) > $text_length))
    {
    $message = str_replace(array(“\n”, “\r”), array(”, “\n”), $row[‘post_text’]);
    $message = get_sub_taged_string($message, $row[‘bbcode_uid’], $maxlen);
    $posts[$i][‘striped’] = true;
    }
    else
    {
    $message = str_replace(“\n”, ‘ ‘, $row[‘post_text’]);
    }

    kodları kullanılmış.

    Sonuç itibariyle o verdiğiniz kodlardan çıkan sonuç sizin mesajınız, $message değişkenine atanıyor, içeriği kırpacaksanız $mesaage değişkeninde uygulamanız gerekir.

  5. İlginiz için çok teşekkür ederim. Yoğunluktan dolayı ancak uygulama fırsatım oldu. Karakterleri istediğim gibi kısaltıyor ama içerikte bir fotoğraf varsa onu silmiyor. Fotoğrafın olduğu kod kadar yazıyı eksik veriyor. O kısmı nasıl düzelteceğiz?

    1. Merhaba
      $v = strip_tags($v); fonksiyonu kullanarak. ilgili fonksiyona aşağıda ekledim.

      function bol($v,$b=10) {
      /*
      $v -> veri
      $b -> Boşluk adedi / varsayılan deger 10 
      */
          $v= strip_tags($v);
          $v = trim($v);
          $v = str_replace(array("\t","\r","\n"), ' ',$v);
          $icerik_bol = explode(' ', $v); // metini bosluklara gore bolduk
          $v = '';
          for($i = 0; $i < count($icerik_bol); $i++) {
               if ($icerik_bol[$i] != '') { // veri yok mu? Atla, varsa ekle
                  if($i<$b)
                  $v .= trim($icerik_bol[$i]).' ';
              }
          }
          $v = trim($v);
          $toplam = explode(' ', $v); // metini bosluklara gore bolduk
          if( count( $icerik_bol ) > count( $toplam  ))
              return $v.'... ';
          return $v;  
      }
      

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir