こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

PHP 文字列抽出

はじめまして。PHPプログラミングの初心者で恐縮ですが、
ご質問させてください。

現在、携帯用HPを作成してPHPによりMYSQLからデータを
表示させるプログラミングを組んでいます。

そこで、DB(MYSQL)からデータを引っ張ってくる際に、
そのデータが長い場合には、
頭から10バイトを抽出して末尾に「…」を追加して
表示させるプログラミングを作成したいと考えております。

ところが、そのデータに半角文字が含まれ最後の10バイト目が
全角の場合、文字化けをしてしまいます。

-------------------------------------------
例)
〔データ〕
 あいaうえおか(23バイト)
  
   ↓(substrにより10バイトを抽出して末尾に…を追加)

 あいaうえ●…

●部分が文字化けする
-------------------------------------------

文字列の「お」の部分を1バイトで抽出している為、
文字化けしてしまっていると思いますが、

うまく「お」まで表示するか、もしくは「お」を
表示し

投稿日時 - 2007-11-07 14:22:52

QNo.3497147

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

5人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

wp_

すんません結合のところ間違い。

 $ii++;

 $position++;

無限ループになるorz

投稿日時 - 2007-11-08 15:32:17

ANo.5

wp_

pack()じゃなくunpackだった。
以下はEUCの場合。
SJISでも同じ要領で出来ます。違うのは10byte目の判別。


$input = "fooもげもげ";

$arr = unpack("C*",$input);
// 10byte目が漢字の1byte目の場合は9byte目まで
// (配列は0を含むので、10byte目→$arr[9])
if($arr[9] > 161)
 $out_position = 8;
// それ以外は10byte目まで
else
 $out_position = 9;

// バイナリを結合
$output = "";
$position = 0;
while($position <= $out_position)
{
 // $arrに入っているのは数字なのでasciiに直してあげないといけない
 $output .= chr($arr[$position]); //chr()でasciiに戻す
 $ii++;
}
echo $output;


文法エラーはご容赦。

参考URL:http://www.unixuser.org/~euske/doc/kanjicode/index.html

投稿日時 - 2007-11-08 15:28:40

ANo.4

6文字を抽出ということでしたら以下でいけると思います。

$_POST['str'] = "あいaうえおか";
$_POST['newstr']=mb_substr($_POST['str'],0,8);
echo $_POST['newstr'];

投稿日時 - 2007-11-08 12:13:51

ANo.3

wp_

pack()で10byte目を取得
 →マルチバイトの1byte目だったら9バイト目までの情報を取得
 →それ以外だったら10byte目まで取得

または
pack()で10byte目を取得
 →通常のASCIIだったら10byte目まで取得
 →それ以外だったら9byte目まで取得

といった流れになります。
文字コードが固定であるならば前者を、そうでないなら後者を組むと良いです。
mb系関数で出来ないことも無いですが、他人が見て分かりやすいかどうかでいえば
pack()を使ったほうが良かろうと思います。

具体的なコードは他の人に期待。
今日の僕は店仕舞いです。

参考URL:http://jp.php.net/pack

投稿日時 - 2007-11-07 18:42:29

ANo.2

mbstringを使って良いのかどうかで変わってきますが。

$str = "あいaうえおか";
$new_str = mb_strimwidth($str, 0, 10, "…")

半角を1、全角を2として合計10になるまでなので、3バイト以上使うエンコードで、そのエンコードで10バイトということなら使えませんけどね

投稿日時 - 2007-11-07 14:43:13

ANo.1

過去にまったく同じ質問をしました。

参考URL:http://oshiete1.goo.ne.jp/qa3259224.html

投稿日時 - 2007-11-07 14:30:39

補足

ご回答ありがとうございます。
すみませんでした、既に出ていたのですね。

先ほど、gogo724275さんの作成した関数(hoge())を
利用させて頂きましたが、
hoge("あいaうえおか", 10, $foot = '')
下記のように表示されてしまいます。

あいaうえ・

上記のように「・」が表示されてしまいます。

実際、「・」を表示しないようにしたいと考えています。

まず「・」が入っているかどうかを判断しなくては
いけないと思いますが、「・」が入っているかどうかを
確認するスクリプトはあるのでしょうか。

もしお分かりでしたらご教授頂きたくよろしくお願い致します。

投稿日時 - 2007-11-07 17:31:48

あなたにオススメの質問