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

正規表現で抽出した文字

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

[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 返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 924 件中 90 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

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