10/10/2018, 09:51

Giúp đỡ về cắt chuỗi để tạo tin vắn tắt trong php

ví dụ mình nhập vào một chuỗi sau:
"chứng kiến sự lao dốc của Vn-Index sau khi Credit Suisse đưa ra khuyến cáo nhà đầu tư nên chốt lời tại thị trường Việt Nam. Cùng ngày, Indochina Capital - một trong những quỹ đầu tư lâu năm và lớn nhất tại thị trường trong nước - tuyên bố thoái vốn"

giờ mình muốn cắt khoảng 30 ký tự để làm tin vắn tắt, mình đã sử lý như sau

PHP Code:
$tom_tat_tin=substr($str,0,30); 
nhưng kết quả không đẹp lắm, đó là nó in ra

chứng kiến sự lao dốc của Vn-In (->Vn-Index bị thiếu)
vậy có cách nào để tách mà mình có thể lấy hết được từ cuối cùng không. Bạn nào có thuật toán nào sử lý được mà dơn giản thì góp ý cho mình với. Cám ơn mọi người !
lucky-boy viết 11:59 ngày 10/10/2018
Code:
function trimmed_title($title, $length = -1, $append = true)
{
	if ($length == -1)
	{
		$length = 10;
	}

	if ($length)
	{
		$titlearr = preg_split('#(\r\n|\n|\r)#', $title);
		$title = '';
		$i = 0;
		foreach ($titlearr AS $key)
		{
			$title .= "$key \n";
			$i++;
			if ($i >= 10)
			{
				break;
			}
		}
		$title = trim($title);
		unset($titlearr);

		if (strlen($title) > $length)
		{
			if (($pos = strrpos($title, ' ')) !== false)
			{
				$title = substr($title, 0, $pos);
			}
			if ($append)
			{
				$title .= '...';
			}
		}	
	}

	return $title;
}
huuhai viết 12:05 ngày 10/10/2018
Trong database, bảng tin tức bạn thêm vào 1 field gọi là intro để nhập đoạn tin vắn đó vào, khỏi cắt mất công.

Hoặc bạn dùng hàm explode tách cái đoạn đó ra, mỗi khoảng trắng thì tách ra được 1 từ, xong rồi dùng hàm implode gộp lại đủ 30 từ để làm đoạn tin vắn

thuyduongcd viết 11:55 ngày 10/10/2018
Tin vắn tắt mà 30 ký tự thì hơn bị ít. (Mỗi từ Tiếng Việt trung bình khoảng 4 ký tự, 30 ký tự chỉ khoảng 7 từ khó mà trọn 1 câu vì vậy đọc khó hiểu nghĩa). Tốt nhất là khoảng 500 ký tự (~100 từ) hoặc tối thiểu cũng 2-300 thì mới tròn một đoạn văn.
Về phương pháp thì có thể dùng hàm sau:
Code:
function limit_text($text,$maxlen){
  $sentenceSymbol=array(".","!","?");  // điểm kết thúc câu
  $text=strip_tags($text,"<br /><br/><br><b><i>"); // những tag muốn giữ lại
  for ($i=$maxlen; $i>0; $i--)  {
      $ch=substr($text,$i,1);
      if (in_array($ch,$sentenceSymbol)){
         $pos=$i;
         $i=0;
      }
  }
  $temp=substr($text,0,$pos+1);
  return $temp;
}
Hàm này sẽ nhận vào 2 tham số là chuỗi cần lấy và độ dài tối đa. Kết quả sẽ trả về 1 đoạn văn (không những tròn chữ mà còn lấy tròn câu).
Phương pháp thì cũng đơn giản thôi. Đầu tiên ta định vị "nhát dao" ở vị trí tối đa (max length), sau đó di chuyển dần về trước, nếu gặp dấu hiệu kết thúc câu (dấu câu) thì "xoẹt" 1 phát trở về trước là được trọn 1 câu (đoạn) tròn trĩnh
ngoc_viet08 viết 12:05 ngày 10/10/2018
ý tưởng hay quá :X :X :X
cắt giữa từ , cắt giữa 2 chữ , cắt giữa 2 câu cũng gây khó hiểu gần như nhau

ý kiến mình thì làm thêm 1 col intro
thuyduongcd viết 12:03 ngày 10/10/2018
Được gửi bởi ngoc_viet08
ý tưởng hay quá :X :X :X
cắt giữa từ , cắt giữa 2 chữ , cắt giữa 2 câu cũng gây khó hiểu gần như nhau

ý kiến mình thì làm thêm 1 col intro
Cái này chủ yếu dùng cho những site tin tức (news). Mà tin tức thì cần nhanh chóng, chỉ cần post xong là đăng ngay, không có thời gian viết intro. Hoặc trường hợp sử dụng RSS, nội dung được lấy tự động từ nguồn khác (thậm chí admin cũng không được đọc qua) thì làm sao viết intro được.
ngoc_viet08 viết 11:54 ngày 10/10/2018
okie .
thường tin tức cũng là 1 bài văn có kết cấu 3 phần . nên chỉ cần copy đoạn mở đầu tin tức là làm intro dc
còn dùng cho RSS và lấy tự động thì it's best ! thanks so much about it !
newmem90 viết 11:55 ngày 10/10/2018
Được gửi bởi thuyduongcd
Tin vắn tắt mà 30 ký tự thì hơn bị ít. (Mỗi từ Tiếng Việt trung bình khoảng 4 ký tự, 30 ký tự chỉ khoảng 7 từ khó mà trọn 1 câu vì vậy đọc khó hiểu nghĩa). Tốt nhất là khoảng 500 ký tự (~100 từ) hoặc tối thiểu cũng 2-300 thì mới tròn một đoạn văn.
Về phương pháp thì có thể dùng hàm sau:
Code:
function limit_text($text,$maxlen){
  $sentenceSymbol=array(".","!","?");  // điểm kết thúc câu
  $text=strip_tags($text,"<br /><br/><br><b><i>"); // những tag muốn giữ lại
  for ($i=$maxlen; $i>0; $i--)  {
      $ch=substr($text,$i,1);
      if (in_array($ch,$sentenceSymbol)){
         $pos=$i;
         $i=0;
      }
  }
  $temp=substr($text,0,$pos+1);
  return $temp;
}
Hàm này sẽ nhận vào 2 tham số là chuỗi cần lấy và độ dài tối đa. Kết quả sẽ trả về 1 đoạn văn (không những tròn chữ mà còn lấy tròn câu).
Phương pháp thì cũng đơn giản thôi. Đầu tiên ta định vị "nhát dao" ở vị trí tối đa (max length), sau đó di chuyển dần về trước, nếu gặp dấu hiệu kết thúc câu (dấu câu) thì "xoẹt" 1 phát trở về trước là được trọn 1 câu (đoạn) tròn trĩnh
Cám ơn bạn nhiều, cách này hay mà đơn giản.
lalalait viết 11:57 ngày 10/10/2018
nếu trong nội dung mà có cả image thì cắt có bị lỗi j ko ạ?
thuyduongcd viết 12:05 ngày 10/10/2018
Được gửi bởi lalalait
nếu trong nội dung mà có cả image thì cắt có bị lỗi j ko ạ?
Hàm này tôi đã lọc bỏ tất cả các tag, trừ những tag đặc biệt được giữ lại như bold, italic... (được liệt kê trong $text=strip_tags($text,"<br /><br/><br><b><i>")) nên nó chỉ lấy phần nội dung chứ không lấy hình ảnh (cho phù hợp với intro)
Bài liên quan
0