PHPで行う文字数カウントのための資料

計算機 ライティング

ちょっと今、文字数のカウント方法について悩んでおりまして……。

スポンサーリンク

ライティングした記事の文字数が知りたい

最近、某クライアントさんの案件で、報酬額の計算が1記事単位から文字数単位に変わりました。これにともなって文字数をカウントすることになったんですが、Wordだとちょっと難しい。

VBAでどうにかできないかとも思ったんですが、やったことがなくて、コードを見てもいまいち理解が足りないのと、理解が間違っていなければ、「見出し」と「本文」だけをターゲットにして空白・改行を入れずにカウントするのは難しいらしい。

Markdownならできそう?

自分で作るか迷っていたところに、QuiitaでMarkdownで作った文章をNode.jsを使って文字カウントする手段を提供してくれてる方がいました。でも、これ、見出しの文字数が入らないのですよね。たぶん、JavaScriptで書いてあるから、コード読んで改良すればいいことではあるでしょうけれども……。(今日はちょっとおなかいっぱい。)

 

文章作成と文字数カウントをWebサイトでやるには?

先日はGoogleフォーム→Googleスプレッドシートでカウントするのが一番楽かな、とも思ったんですが、そこからWordファイルまで持って行くのが手間で。いや、頑張ればできるかもしれないけれども。現時点ではちょい余裕がないです。

むしろ、直近でやるなら、JavaScriptかPHPでカウントできるようにサイトを作ってみるほうがまだ実現可能性がありそうです。だって、Word VBAの時と違って資料がいっぱいあるんですもの。

ってわけで、あとで読むために以下に気になるページを貼り付けておきます。頑張れよ、自分。

文字数カウントのためのPHPコーディングの資料

ざっくりと調べたところと、既存知識によると、日本語の文字カウントで問題になるのは、

  1. マルチバイトの文字をカウントする
  2. 改行をカウントしない
  3. 半角・全角の空白をカウントしない

の3つのポイント。私が欲しい文字カウントはこれらのすべての機能を実現してないといけません。

マルチバイトの文字のカウント

mb_strlen:文字列の文字数をカウントする

マルチバイト文字列をカウントするmb_strlenというのをシンプルに紹介。

21. mb_strlen()関数の落とし穴
 mb_strlen()関数は、日本語などのマルチバイト文字列の文字数をカウントする関数ですが、気をつけて使わないと思わぬバグの原因になってしまうことがあります。

mb_strlenで数えさえすればいいってわけじゃなくて、文字のエンコードも指定しないと、文字数がおかしくなっちゃう。なので、オプションの引数で文字エンコードを指定する。

mb_strlen関数による文字数のカウントがおかしいとき
mb_strlen関数でカウントした文字数がおかしく感じることがあります。ほとんどの場合、マルチバイト関数で使…

上のページで話しているエンコードの件で、マルチバイト文字コードを一括設定する方法(?)を紹介。.htaccessで設定することもできるらしい。

改行の処理

mb_strlenと改行コードの罠 - Narusaseの日記 -ハニポってどうよ?(仮)-
PHPのmb_strlenはCR+LFを2文字(バイトではなく文字な所に注意)として認識するため、CR+LFとLFが混在するような使い方をされた場合に、思った通りにコードが動かないことがある。下記コードを参考にして貰うと解るがCR+LFは2文字と解釈される。 これに対する簡単な対策としては事前にCR+LFをLFに置き換...

WindowsはCR+LF、Linux(?)はLFで改行を記録している(改行コード)んだけど、これを考慮しておかないと、例えば改行~CT+LF=2文字とカウントされてしまう! これを防ぐ方法。(個別に改行をカウントして、最後に全体から引くのかな……?)

『文字数のカウントと改行~mb_strlenとtextarea~』
フォームのテキストエリアにJSでtwitterみたいに残りの入力できる文字数をリアルタイム表示させたら。。phpのmb_strlenでのカウントと誤差が・・・…

Web上のフォームに入力するときに、JavaScriptで文字数をカウントしつつ、PHPでもデータベースに入る文字数をカウント、でフツーにやると改行でつまづくらしい。ので、その対処。(mysql_real_escape_string というのと、入力フォームの改行位置にbrタグを入れてくれる関数nl2brというのがあるらしい。)

UTF-8 で mb_strlen 使う時は明示的に文字コードを指定しないといかんのね
他人様が作られた PHP ソースに「文字数チェック入れてもらえますか」と依頼があったので、 $w_len = mb_strlen($word); if ($w_len > 300) { Fnc_Err_Html(

こちらもの方はCR+LFの改行を空白に置き換えてから文字数カウントにかけることにしてみたようだ。(で、ダメだったのかな? とすると、改行の処理の最初のリンク先みたいにするのが良さげ。)

半角・全角の空白

正規表現:半角/全角スペースと、空白文字の表現 | WWWクリエイターズ
正規表現での、全角、半角のスペースの表現方法についてです。 正規表現における半角・全角スペースの表現 正規表現で、半角スペースと全角スペースは、エスケープが不要な文字のひとつです。ですので、通常通り普通の文字として記述すればOKです。 半角スペース 通常通り、半角スペースを文字として記述します。下記は、量指定子の「{n...

半角・全角の空白=スペースと、タブの正規表現での書き方。

文字列の前後にある空白文字(スペース・タブ)を取り除く | GRAYCODE PHPプログラミング
preg_replace関数やtrim関数を使い、文字列の前後に含まれる空白を除去する方法について解説します。

文字列中の空白を除去するtrim関数preg_replace関数などについて。これ、コード内に全角スペース置いてるんですかね、いいのかな?

PHP: エスケープシーケンス - Manual

PHPのエスケープシーケンス。バックスラッシュをつけて書く、特別な書き方。(余談ですが、改ページのコードがあるけど、これ入ってたらヤバそう。web上からの入力ならいいけど、Wordとかをアップロードして任意の形式で文字数カウントするようなサービスだったら確実に引っかかりそう。心に留めておこう……。あれ、Shift+Enterの改行って何になるんだ?)

PHPで全角スペースのtrimがうまくできない時に試すこと - Qiita
##忘備録メモ PHPでは通常スペースを取るときtrimを使いますが、それでは半角スペースしかtrimできません。 そこで全角スペースをtrimしたいときは変則的に全角スペースを半角スペースに変換してからtrimしたりします。 そ...

mb_convert_kanaって関数で全角スペースを半角スペースに変換するというのを紹介。
うーん、どうだろう。上のほうのpreg_replace関数ならそれ一行だけで済むけど、mb_conver_kanaはさらにtrim関数使って空白除去で手間がかかりそうだ……。

【PHP】マルチバイト(全角スペース等)対応のtrim処理 - Qiita
ワリと需要のある処理だと思いますが、改めてググってみるとあまりマネして欲しくないコードが散見されたため、この記事を書いてみました。 - (

文字列中の空白だけじゃなくて、ほかのも一緒に削除しちゃう。

要するに、文字列の前後から、空白文字や改行の他 通常は不要と思われる制御文字なんかもまとめて全部削除しちゃえ!という意味になります。

っておっしゃるとおり、私=初心者が見るとさっぱりな文字を拾うエスケープシーケンスが入ってます。使うならこれじゃない? 上のほうの疑問点がクリアされてるぞ!

 

 

余談:結局、Wordで書くべきか?

しかし、悩みますね。

Twitterで書いた、Markdownでの文字カウントは悪くはなかったんだけど、ベストでもなくて。Markdownに使う快適なテキストエディタ(Windows10で問題なく使えるもの)も今ひとつ見つからないし……。

ひとまず今月はWordで書いて、選択部分の文字カウントさせて、最後に手計算かなぁ。

 

 

しかし、こうした作業がアナログすぎてぞわぞわする程度にはプログラマー的省エネ思考になってきたの、すごいぞ!

コメント

タイトルとURLをコピーしました