ブログ・エス技研

当ブログは引越しをしました。10秒後に自動で転送しますが、転送されない場合は、http://blog.s-giken.net/ をご覧ください。
ブログ・エス技研 TOP  >  スポンサー広告 >  Google Swiffy >  Swiffyで変換されたファイルの Base64変換された画像を置換する方法

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --年--月--日 --:-- ] カテゴリ:スポンサー広告 | TB(-) | CM(-)

Swiffyで変換されたファイルの Base64変換された画像を置換する方法

Swiffyで変換されたファイルの Base64変換された画像を置換する方法

PHPでpreg_match_all、preg_replace、str_replaceを使って任意の場所の文字列を置換する方法


Swiffyのテンプレートを作るツールを作成する際、置換する画像を「Base64」を目印にデータを置換する処理を作りましたが、置換する必要がない画像もあるわけです。

例えば、ABCという画像があり、Aと Cは置換するけど Bは置換せずにそのままにしておきたい。という場合です。

ですが、preg_replace、str_replaceの機能には、全部を置換する、1個目を置換する、と言った機能はありますが、「2個目」「1個目と 3個目」と言った場所を指定して変換する機能はありません。

PHPのコマンドのなかに、それを一つのコマンドで実行できるものはないようです。

そのため、いろいろ悩んだ結果、私が採った方法は、
 ・一度前から順番に置換
  (その際、元に戻す部分に印を付けていく)
 ・印がついている部分を元に戻す
という感じです。

具体的なソースは、以下の通りです。



// 置き換える場所を指定
$replase_array = array (1,4);
// 置き換えるコードのスタートのカウント
$replase_cnt = 1;
// swiffyで変換されたファイルの中身
$subject

// 置換する文字列の事前チェック
preg_match_all ( '/base64,[A-Za-z0-9+\/\n=]*"/', $subject, $matches_array );
$i = 1;
foreach ( $matches_array[0] as $val ) {
  $matches[$i] = $val;
  $i++;
}
$matches_cnt = count ( $matches );


// 「base64,」をキーに画像部分を置換
for ( $i = 1; $i <= $matches_cnt; $i++ ) {
  if ( in_array ( $i, $replase_array ) ) {
    $replacement = 'base64,<!--data_0' . sprintf("%02d",$replase_cnt) . '-->"';
    $replase_cnt++;
  } else {
    $replacement = 'base64,<!--return_0' . sprintf("%02d",$i) . '-->"';
  }

  $subject = preg_replace( '/base64,[A-Za-z0-9+\/\n=]*"/', $replacement, $subject, 1 );
}

// 置換する必要がなかった部分を元に戻す
for ( $i = 1; $i <= $matches_cnt; $i++ ) {
  $replasement = 'base64,<!--return_0' . sprintf("%02d",$i) . '-->"';
  $subject = str_replace ( $replasement, $matches["$i"], $subject );
}
**************************************


これを関数化できればいいのですが、↓こんな部分とか、
 $replacement = 'base64,<!--data_0' . sprintf("%02d",$replase_cnt) . '-->"';
                 ↓こんな部分とか
 $replacement = 'base64,<!--return_0' . sprintf("%02d",$i) . '-->"';

を汎用性がある書き方にする方法がピンと来なくて、今のところ関数化はしていません。
今後、何度か同じ様な処理が必要になった際に、どのように汎用的な関数にするべきか、改めて考えたいと思います。

※一部、ソース上の「<」「>」などを全角文字で記述しています。
関連記事
スポンサーサイト
[ 2012年12月28日 10:31 ] カテゴリ:Google Swiffy | TB(0) | CM(0)
コメントの投稿












管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL

プロフィール

エス技研

Author:エス技研
性別:男性
職業:Web系エンジニア
エンジニアになって 15年ほど経ちますが、その途中で 5年ほどディレクタ、マネジメントを中心とした業務を行っていたためにやや現場を離れていましたが、転職をきっかけに 2012年に現場に復帰し、新たな技術を楽しみながら勉強しています。
メインの環境は LAMP環境です。

FC2ブログランキング
FC2カウンター
FC2拍手ランキング
GoogleAdWords
カレンダー
07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
検索フォーム
ブロとも申請フォーム
QRコード
QR
フリーエリア


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。