php substr_replaceのマルチバイト版

2011/05/25

substr_replace()のマルチバイト版が無いようなのでつくってみた。
「substr_replace()」と同じ引数で動くはず。

  1. echo mbSubstrReplace( "あいうABCDEFGHIあいうJKLMNOPQRSTU", "abcd", 0, 5 );
  2. // 結果:abcdCDEFGHIあいうJKLMNOPQRSTU
  3.  
  4. /**
  5. * mbSubstrReplace() – substr_replace()のマルチバイト版
  6. * @param str $str 対象の文字列
  7. * @param str $replace 置換えたい文字列
  8. * @param int $start 開始位置
  9. * @param int $num 文字数
  10. */
  11. function mbSubstrReplace( $str, $replace, $start, $num=NULL ){
  12.   // 文字数取得
  13.   $strNum = mb_strlen($str);
  14.  
  15.   if( $start < 0 ){
  16.     // 負の値だったら終端からの位置
  17.     $start = $strNum + $start;
  18.     if( $start < 0 ){
  19.       // 終端からの位置が負の値になるなら「0」にする
  20.       $start = 0;
  21.     }
  22.   }
  23.  
  24.   // 置換える箇所の「前」を取得
  25.   $tempBefore = mb_substr($str, 0, $start);
  26.  
  27.   if( $start > $strNum ){
  28.     // 開始位置が文字数より多い
  29.     $num = $strNum;
  30.   }
  31.  
  32.   if( !isset($num) ){
  33.     // 文字数の指定無し
  34.     $num = $strNum;
  35.   }elseif( $num < 0 ){
  36.     // 負の値だったら置き換えない終端までの文字数
  37.     $num = $strNum + $num;
  38.     if( $num < 0 ){
  39.       // 「置き換えない終端までの文字数」が負の値になる場合
  40.       $num = $start – $strNum;
  41.     }
  42.   }else{
  43.     $num = $start + $num;
  44.   }
  45.  
  46.   // 置換える箇所の「後」を取得
  47.   $tempAfter = mb_substr($str, $num, $strNum);
  48.  
  49.   // 置換えの文字と合体
  50.   return $tempBefore . $replace . $tempAfter;
  51.  
  52. }

新着(ニュース関連以外)

2017-07-19
折れ線グラフをもう少しゆるやかに・・・というか何というか・・・調べていくと「移動平均」っていう言葉にたどり着いた
2017-07-10
FuelPHPの1.8をダウンロードして使っていたらセッションが使えないということに気付いた。
2017-06-27
MACにWin10をインストールしてみた:再挑戦。
2017-06-25
「簡単」っていうヤツらが多いけど・・・難しいぞ。
2017-06-06
FuelPHPのOILでtry・catchを使ったらエラーになった。