その他
    ホーム技術発信DoRuby長い文字列をカットして表示するプログラム

    長い文字列をカットして表示するプログラム

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    こんにちは。
    KBMJでRuby on Railsを使ったWebの開発をしている本多と申します。

    今回は「指定の文字数より長ければカットして表示する」というプログラムを紹介したいと思います。

    Ruby のソースコードは以下です。

    $KCODE=’u’ #文字コードを指定。今回はutf-8の場合
    require ‘jcode’ #jlength(マルチバイトの文字列の長さを取得するメソッド)を使用するためにjcodeを読み込む

    def cut_off(text, len)
      if text != nil
        if text.jlength < len
          text
        else
          text.scan(/^.{#{len}}/m)[0] + “…”
        end
      else
        ”
      end
    end

    puts cut_off(“任意の文字列”, 任意の文字数(整数))

    上のソース内のtextとは「カットしたい文字列」、lenとは「カットしたい長さ」です。
    指定の文字数よりも長い場合に正規表現を用いて先頭からlenの長さだけ文字列を抜き取り、末尾に”…”を付加したものを返します。
    [0]が付いていますが、これはscanという関数が「パターンにマッチした文字列を、マッチした数だけ配列で返す」という特徴を持っているため、
    text.scan(/^.{#{len}}/m) + “…”と書いてしまうと


    [“マッチした文字列”] + “…”


    になってしまい、配列 + 文字列という処理を行おうとしてエラーが出ます。

    textの中身がlenより短い文字列の場合はそのまま返します。

    この関数の最大の魅力は「日本語(マルチバイト)に対応しているという点です」
    例えばcut_off(“こんにちは。KBMJの本多です。”, 10)と書くことで
    「こんにちは。KBMJ…」という文字を得ることができます。


    注意点としては、必ず『$KCODEの宣言』と『jcodeの読み込み』を行うようにしてください。
    $KCODEが宣言されていない場合は正常な文字数で取り出せず、
    jcodeが読み込まれていない場合はNoMethodErrorが出てしまいます。

    ちなみに Ruby on Rails でcut_offを使用する場合はソースを書く場所がそれぞれ以下になります。

    (RAILSROOT)/config/environment.rb

    先頭の行に追加

    $KCODE = ‘u’
    require ‘jcode’
    # Be sure to restart your web server when you modify this file.

    # Uncomment below to force Rails into production mode when
    ————————-中略—————————-


    (RAILSROOT)/app/helpers/application_helper.rb

    # Methods added to this helper will be available to all templates in the application.
    module ApplicationHelper

      def cut_off(text, len)
        if text != nil
          if text.jlength < len
            text
          else
            text.scan(/^.{#{len}}/m)[0] + “…”
          end
        else
          ”
        end
      end

    end


    (RAILSROOT)/app/views/hoge/hogehoge.rhtml

    <%= cut_off(“文字列”, 20) %>


    これでRails上でも任意の文字数でカットできるようになりました。

    例えばブログのタイトルのみを表示させるインデックスを作成する際、
    長すぎるタイトルをそのまま表示するとレイアウトが崩れる原因になることがあります。
    そんな時に役に立つのが、このcut_offです。
    是非活用してみてください。
    それでは。

    GOOD RAILS!!