匿名質問者

perlで文章の最後の方を「…」にする方法


説明文が長い時に○文字目以降を切り取っているのを見かけますが、あればどのようにしたらいいのでしょうか?
エンコードはutf-8で$comに文章が入っています。
全角半角が混ざっていますが、出来るなら長さがきちんとそろうようにしたいです。
(半角2文字を全角1文字として扱う事は可能でしょうか?)

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2018/01/25 18:40:05

回答1件)

匿名回答1号 No.1

かなり強引でスマートな方法ではないですが。

use strict;
use warnings;
use utf8;

use Encode;

my $com = do { local $/; <DATA> };

my $utf8 = find_encoding('utf8');
#$com = $utf8->decode($com);	#文字列を内部コードへ変換。このテストでは不要

my $len = 300;		#切り出すバイト数
my $result = $utf8->encode(getBytesFromStr($com,$len));
print $result;

exit;

sub getBytesFromStr {
	my($input,$len) = @_;

	my $cmap = $input;

	$cmap =~ s/[\x20-\x7e\x{FF64}-\x{FF9F}]/1/g;	#半角英・数字・記号と、いわゆる「半角カタカナ」
	$cmap =~ s/\n/0/g;
	$cmap =~ s/[^01]/2/g;

	my @cmap = $cmap =~ /./g;
	my $count = 0;
	my $bytes = 0;
	foreach(0..$#cmap) {
		$bytes += $cmap[$_];
		$count++;
		last if $bytes >= $len;
	}
	$count-- if $bytes > $len;

	substr($input,0,$count).'…';
}

__DATA__
perlで文章の最後の方を「…」にする方法

説明文が長い時に○文字目以降を切り取っているのを見かけますが、あればどのようにしたらいいのでしょうか?
エンコードはutf-8で$comに文章が入っています。
全角半角が混ざっていますが、出来るなら長さがきちんとそろうようにしたいです。
(半角2文字を全角1文字として扱う事は可能でしょうか?)
匿名質問者

ありがとうございます!!

2018/01/22 10:14:45

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません