delicious! newsing! buzzurlにブックマーク! Yahoo!ブックマーク ライブドア - この記事をクリップ! このエントリーを含むはてなブックマーク

php :: html文字列を決まった文字数で分割する関数

2009/6/25 (Thu) at 9:42 am

エントリのアイコン

ケータイサイトをつくる場合など、htmlテキストを決まった文字数で分割しなくちゃと思ったとする。そこで、stringを渡すと配列にして返すという関数をつくろうとしたとき、単純に文字数でブッタ切るとへんになります。タグの途中で切れちゃうことがあるし、タグが閉じられないままに次のページにいっちゃうじゃないですか。てわけでこういうのを書きました。


function split_html($str, $limit=4000){
  $str = str_replace(array("?r?n", "?r"), "?n", $str);
  $str = preg_replace("/?n+/", "", $str);
  $temp = preg_split("/(<?/[^>]+>)(<[^>]+>)/s", $str, -1, PREG_SPLIT_DELIM_CAPTURE);
  $str = '';
  for($i = 0; $i < count($temp); $i++){
    if($i == 0 || is_int($i/3)){
      $str .= (isset($temp[$i-1]) ? $temp[$i-1] : '').$temp[$i].$temp[$i+1];
      if(mb_strlen($str) > $limit){
        $array[] = $str;
        $str = '';
      }
    }
  }
  if(!empty($str)){
    $array[] = $str;
  }
  return (isset($array) ? $array : array());
}

引数はふたつ。$strはhtmlテキスト、$limitは上限文字数です(指定しない場合はデフォルト値4000になる)。htmlを渡すと配列を返します。

注意点。返される結果は$limitよりもチョイ多めになり、あいまいな文字数で分割されるという仕様です。html内のタグの切れめ、たとえば "</p><div>" なんていうところで分割し、分割された個々のブロックを一個ずつ積み上げていって文字数が$limitを超えたところで、いっこできあがり、ハイ次、という仕組みになっているからです。なので、ひたすら長文のパラグラフが含まれるものを処理したい、とか、厳密に決められた文字数で分割したいという用途には不向きです。普通のウェブサイトの文章ならば、読みやすいように5行おきくらいにpタグが入ってると思うんでまぁいいかと。

私は分割された結果を見つつ、$limitにチョイ少なめの値を指定して使っています。モバイルサイトをつくるときでしたら、その中に含まれる画像やヘッダの容量などもあるんでそのぶんも少なめに。

htmlでないプレーンなテキストデータを処理するんなら、以下のようなサンプルがありました。こちらは単純に文字数で切っていくというヤツです。


$str_array = array();
$length = 10;
for ( $i=0; $i&lt;mb_strlen($string); $i+=$length ) {
  $str_array[] = mb_substr($string,$i,$length);
}
print_r($str_array);

phpで文字列の分割について。- 人力検索はてな

こちらのほうもべんりそうなのでメモメモ。メール送信処理のプログラムなどで使えそう。それにしてもこんなに短く書けるんですね。私も同じ機能の関数を自分で書いて使ってましたが、私のはもっと長いですよ。奥が深いなー。

delicious! newsing! buzzurlにブックマーク! Yahoo!ブックマーク ライブドア - この記事をクリップ! このエントリーを含むはてなブックマーク

add your comment!
2009/10/18, 2:54 AM
コメント アロー! one-px-ffffff-br one-px-ffffff-tr one-px-ffffff-bl one-px-ffffff-br

あ、エントリをアプしたあとに気づいたのですが、この関数はいまいち。ものすごく単純なパターンしか対応しません。htmlタグがネストしているばあい、へんになります。どうもすません。またいずれ精進をしましたら、よりよい改訂版をアプしたいと思いますが、あれこれ考えるとけっこうむずかしいことに気づいた。

one-px-ffffff-tr one-px-ffffff-bl one-px-ffffff-br

コメント・プリーズ!

お名前 (your name)
(required)
url
(optional) ※公開されます。
メールアドレス (email)
(optional) ※公開されません。管理者にだけわかります。
コメント (comment)
(required)

※クッキーに保存すると次回から入力を省略できるので便利ですが、お使いのコンピュータに情報が残りますので、公共のパソコンなどからアクセスするような場合はチェックをはずしたほうがよいでしょう。

※コメント中のhtmlタグは実体参照に変換されます。たとえば、『<』は『&lt;』というかんじになりますのでhtmlタグをそのまま書き込んでくださってオッケーです。

one-px-ffffff-tl one-px-ffffff-tr one-px-ffffff-bl one-px-ffffff-br

PROFILEcaption

藤居ヒロヤ。ウェブデザイナー/ウェブディレクター。ウェブデザインオフィス、3OT NET主宰。名古屋市中区。「優しいデザイン」「激しいデザイン」「正しいデザイン」「セクシーなデザイン」「泣けるデザイン」「もっともなデザイン」... 。あなただけのウェブデザインを丹精込めておつくり致します。見積り依頼等、お気軽にお問い合わせ下さい。

お問い合わせフォーム

RECENT ENTRIEScaption

RECENT COMMENTScaption

TOOLScaption

BOOKMARKScaption

RESOURCEScaption

ARCHIVEcaption