スレッド表示 | フラット表示〕 全トピック 920 件中 86 番目 次≫ ≪前

正規表現で抽出した文字

created: 2007-06-16 20:38 | modified: 2007-10-06 06:26 | reply: 7

[3770] 正規表現で抽出した文字

user: から | created: 2007-06-16 20:38
DoCoMoの絵文字の文字コードを渡すと端末にで表示できるようにしたhtmlを返すクラスに正規表現で抽出した文字コードを渡すと該当文字がないとエラーになります。文字コード'F9A3'も、正規表現で抽出したコードも見た目は一緒の'F9A3'でも、md5すると値が違うのでヤッパリ中が違うのじゃないのかと思います。

$com…絵文字を含む文字列
$MobileClass->Convert('')…絵文字の文字コードを渡すと端末に合わせた表示方法に変換して帰ってくる
//------動かない
mb_substitute_character("long");
$com=mb_convert_encoding($com,"SJIS","SJIS");
$com=preg_replace("/BAD\+([A-F0-9]{4})/",$MobileClass->Convert('\\1'),$com);
//------動く
$MobileClass->Convert('F9A3');
reply: 3771 返信 編集 削除

[3771] Re. 正規表現で抽出した文字

user: ゆうじ | created: 2007-06-16 22:19
こんばんわ。

//------動く
$MobileClass->Convert('F9A3');

↑これが動くのなら、
この $MobileClass->Convert() は「文字コード」ではなく、
「文字コードを16進数で表現した文字」を引数にする仕様なんですね。

文字列 'F9A3' と 16進数 F9A3 は別物なので
md5でハッシュ値を取れば違うのは当然とおもいます。

1.文字列から絵文字コードを拾い出す。
2.16進数の文字列に変換する。
3.$MobileClass->Convert() に渡す。

この3段ステップが必要だと思います。


# 何か論点がかみ合ってない気もしますが。合ってますか?
# 以下論点が合ってれば参考に。

$com=preg_replace("/BAD\+([A-F0-9]{4})/",$MobileClass->Convert('\\1'),$com);

↑この正規表現では
「'A'~'F' '0'~'9'のいずれかで構成された連続した4文字」
にマッチしますので、
「絵文字コード」である保証も無く、エラーになると思うのですが。

ちなみに文章中の絵文字コードを
正規表現だけで拾い出すのは至難の業だったので
http://www.sound-uz.jp/php/note/mobile
このページでは、1バイト毎に前後の文字を確認する方法をとりました。

また、関係ないのかもしれませんが
正規表現中の 'BAD+'って何でしょう?
近頃の携帯端末の仕様でしょうか。
Parent: 3770  reply: 3772 返信 編集 削除

[3772] 返信ありがとうございます

user: から | created: 2007-06-16 23:44
返信ありがとうございます。参考にもがいてみます

もがいてるのですが、相談が…strlen($data)で文字列の長さを調べてみたところ、$data='A8A3';は4、正規表現の置換によって入って来た変数は2となっているのですが、何か原因は考えられないでしょうか? ちなみに表示させてみると同じように表示されます。

正規表現中の 'BAD+'は正規表現で置換している前の2行でSJISからSJISに文字コードを変換することで、無効な文字を抽出しています。
参考:http://hain.jp/index.php/tech-j/2006/09/11/携帯絵文字
Parent: 3771  reply: 3773 返信 編集 削除

[3773] 携帯絵文字コードの保持++

user: ゆうじ | created: 2007-06-17 17:09
参考URL拝見しました。これなら、
絵文字のような外字コードを保持したまま
エンコード変換が可能ですね。すばらしい。
今後は使ってみたいと思います。

私がこれを知らなかったので
先の投稿は参考になりませんね。失礼しました。


正規表現の置換によって入って来た文字の長さが2ってことですが、
/BAD\+([0-9A-F]{4})/ で拾えるのは4バイトのはずですね。
これを $MobileClass->Convert() に渡せば、
2バイトの文字コードが返ってくると思うのですが違いますかね。

$MobileClass->Convert()の仕様もわかりませんし
状況をまちがって把握しているかもしれません。
動く・動かないというのは、どういう状態なんでしょうか?
Parent: 3772  reply: 3774 返信 編集 削除

[3774] 返信ありがとうございます

user: から | created: 2007-06-17 18:09
$MobileClass->Convert()は参考URLのサイト様からダウンロードしたフリーのスクリプトです。簡単な仕様しては、i-modeの絵文字の文字コードを渡すと、端末に合わせたタグが帰ってくるのです。

参考:http://surf-style.us/manual2.htm
Parent: 3773  reply: 3775 返信 編集 削除

[3775] preg_replaceの仕様?

user: ゆうじ | created: 2007-06-17 20:43
MobileClass ダウンロードして試してみました。
こんな便利なライブラリーがあったんですね。
これまたすばらしい。

それで、以下のコードを試したところ
原因らしきことを発見しました。

$Mob->Convert("\\1")のところですが、
/BAD\+([0-9A-F]{4})/ にマッチしたら
"\\1"が後方参照として評価される前に
$Mob->Convert が実行されてと思われます。

後方参照を、関数の引数に渡すのは無理なようです。

<?php
require_once 'MobileClass.php';

// 絵文字コードを含んだ文字列
$str = "あい\xF9\x48うえお";

mb_substitute_character("long");
$str = mb_convert_encoding($str, 'SJIS', 'SJIS');

$Mob = new MobileClass();

// 後方参照してるつもりが、文字の"\\1"を $Mob->Convert に渡してるだけ
$str = preg_replace('/BAD\+([0-9A-F]{4})/', $Mob->Convert("\\1"), $str);

echo $str;

一旦PHPコードとして置き換えておいて、後でeval。
力技ですがこれならいけるか。
<?php
require_once 'MobileClass.php';

// 絵文字コードを含んだ文字列
$str = "あい\xF9\x48うえお";

mb_substitute_character("long");
$str = mb_convert_encoding($str, 'SJIS', 'SJIS');

$Mob = new MobileClass();

// マッチした文字列を、後方参照で一旦PHPのコードに整形。
$str = preg_replace('/BAD\+([0-9A-F]{4})/',
'<?php echo $Mob->Convert("\\1"); ?>', $str);

eval('?>'. $str);


#追記
バッチリなのを見つけました。
なので上のevalの方法は止めときましょう。

わかりずらいですが、
マニュアルをよくよく読むと書いてありました。
正規表現の修飾子に e を指定するだけで、
後方参照を関数の引数にすることが出来て
関数が返してきた文字列で置き換されます。

<?php
require_once 'MobileClass.php';

// 絵文字コードを含んだ文字列
$str = "あい\xF9\x48うえお";

mb_substitute_character("long");
$str = mb_convert_encoding($str, 'SJIS', 'SJIS');

$Mob = new MobileClass();

// 修飾子 e を指定すると、
// 後方参照を含めた式の結果で置き換えされる
$str = preg_replace('/BAD\+([0-9A-F]{4})/e', $Mob->Convert("\\1"), $str);

echo $str;
Parent: 3774  reply: 3776 返信 編集 削除

[3776] 光が見えて来ました

user: から | created: 2007-06-17 22:18
ありがとうございます!!しっかり変換されました。

後は、i-mode以外の端末の絵文字をi-modeの絵文字に変換するだけです。また相談することがあるかもしれませんが、その時はよろしくお願いします。
Parent: 3775  reply: 3925 返信 編集 削除

[3925] ここ

user: 適当 | created: 2007-10-06 06:26
すべて対応させたら配布してください><
Parent: 3776  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 86 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑