人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

*求む!天才プログラマ*

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はさっさと購入者だけレビューできるようにしてくれ
今だと
>元々公正さも何もあったものじゃないし

という引用になってしまいます。

どうしたらいかなる選択範囲も<人間が見て>綺麗に見えるように処理できるでしょうか。

項目としては
・なんとなく短い文は絶対折り返さない
・しかし一定文字数で折り返す
・文頭には必ず引用符号をつける
・人間が見て綺麗に見えること
という感じです。

かなり矛盾する条件も入っているのですが、これに近づける処理を実装するためにどういった処理がいいか、ヒントだけでももらえればと思います。


●質問者: ryuzi_kambe
●カテゴリ:コンピュータ インターネット
✍キーワード:Amazon PHP UTF-8 テキスト ブックマークレット
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● karaki
●27ポイント

| > 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は不慣れなため、上記スクリプトは間違っているかもしれませんが、方針程度に)

◎質問者からの返答

回答ありがとうございます。

今回は、http://clipmail.jp/ というサービスのブックマークレットの話です。メールで送信するために完全なプレーンテキストとしてシリアライズする必要があるため、CSS による見栄え調整は意味がないかもしれません。

引用テキストは

http://koerarenaikabe.livedoor.biz/archives/51342595.html

の >61 になります。ソース上で
と改行が入っているのがわかるかと思います。


ちなみに、いただいたコードを下記のように書き直したところ、なんだかうまくいっているような感じです!

$s = "";

$l = split("\r\n",$_s);

foreach($l as $ll){

$length = mb_strlen($ll, "UTF-8");

for($i=0; $i < $length; $i+=35){

$s .= "> ".mb_substr($ll, $i, 35 , "UTF-8")."\r\n";

}

}

これで少し様子を見てみます!


2 ● 敷守ほむら
●27ポイント

こんなかな?

define('LENGTH_CUT', 35); // 文字列を切る長さ

$_s = 'amazonはさっさと購入者だけレビューできるようにしてくれ'.PHP_EOL.'今だと元々公正さも何もあったものじゃないし';
$s = '';

$arr = split(PHP_EOL, $_s);

for ($i = 0; $i < count($arr); $i++) {
$cnt = 0;
for ($j = 0; $j < mb_strlen($arr[$i], "UTF-8"); $j++) {
if ($cnt == 0) $s .= "> ";
$s .= mb_substr($arr[$i], $j, 1, "UTF-8");
$cnt += strlen(mb_substr($arr[$i], $j, 1, "UTF-8")) == 1 ? 1 : 2;
if ($cnt > LENGTH_CUT) {
$cnt = 0;
$s .= PHP_EOL;
}
}
$s .= PHP_EOL;
}

echo nl2br($s);

表示する時にフォントは等角フォントで。


3 ● zista
●26ポイント

正規表現で。

$s = preg_replace("/([^\r\n]{0,35})(\r\n)?/u","> $1 \r\n",$_s);

最後に一行余分に入ってしまうのが難点。正攻法があれば教えて欲しいです。

とりあえず以下のように少し修正してみました。

$s = preg_replace("/([^\r\n]{1,35})(\r\n)?|\r\n/u","> $1 \r\n",$_s);

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ