PHP でのテキスト処理についての質問です。
現在、ブックマークレットで選択したテキスト $_s を、引用符号付きに整形するという処理を下記のように行っています。
$length = mb_strlen($_s, "UTF-8");
for($i=0; $i < $length; $i+=35){
$s .= "> ".mb_substr($_s, $i, 35 , "UTF-8")."\r\n";
}
しかし、これで
amazonはさっさと購入者だけレビューできるようにしてくれ
今だと元々公正さも何もあったものじゃないし
という2行を引用すると、
> amazonはさっさと購入者だけレビューできるようにしてくれ
今だと
>元々公正さも何もあったものじゃないし
という引用になってしまいます。
どうしたらいかなる選択範囲も<人間が見て>綺麗に見えるように処理できるでしょうか。
項目としては
・なんとなく短い文は絶対折り返さない
・しかし一定文字数で折り返す
・文頭には必ず引用符号をつける
・人間が見て綺麗に見えること
という感じです。
かなり矛盾する条件も入っているのですが、これに近づける処理を実装するためにどういった処理がいいか、ヒントだけでももらえればと思います。
| > amazonはさっさと購入者だけレビューできるようにしてくれ
| 今だと
| >元々公正さも何もあったものじゃないし
と表示されるのは、ウェブページ上でそうなるのでしょうか?それとも「してくれ」の後に改行が入っているのでしょうか?
前者の場合は、ウェブページの表示の問題なのでcssで「white-space:nowrap」を指定するなどして回避する必要があります。
また、既に入力されている改行を考慮するのであれば、最初に$_sを"\r\n"でsplitして配列の各データごとに上記の処理を行い改行でつなげるなどの処理が必要だと思います。
var s = ""; var l = $_s.split("\r\n"); for (var j=0;j<l.length;j++) { $length = mb_strlen(l[j], "UTF-8"); for($i=0; $i < $length; $i+=35){ $s .= "> ".mb_substr(l[j], $i, 35 , "UTF-8")."\r\n"; } $s .= "\r\n"; }
(PHPは不慣れなため、上記スクリプトは間違っているかもしれませんが、方針程度に)
※つまり、
> amazonはさっさと購入者だけレビューできるようにしてくれ今だと元々
> 公正さも何もあったものじゃないし
となってしまうのはNGということです。
今回の場合は
> amazonはさっさと購入者だけレビューできるようにしてくれ
> 今だと元々公正さも何もあったものじゃないし
とするのが理想なのですが、そうするともう少し違う長さの引用でレイアウト崩れが起きてしまいそうです。
どういったテストパターンを用意すればいいかというブレスト結果だけでも、十分回答として意味がありますのでぜひぜひよろしくお願いいたします。
http://phpspot.net/php/man/php/function.wordwrap.html
そのため今回も手動で処理を書いています。
それがあるとすれば、改行を削除して、
茶筅などで形態素解析して最大文字数の直前の要素の前に改行を入れる。
などとすれば良いのではないでしょうか?
茶筅もこんど使ってみたいと思います。
コメントありがとうございました。
>|
if ($cnt > LENGTH_CUT) {
|<
のブロックは
>|
if ($cnt == 0) $s .= "> ";
|<
の前に移動してください。
あと、LENGTH_CUTの定数はバイト数です。70バイトで切りたい場合は70に。
Javascriptだけで書かれたコンパクトな分かち書きソフトウェア(chasen.org)
http://chasen.org/~taku/software/TinySegmenter/
上のPHP版
http://programming-magic.com/?id=172