PHPにて下記のような文字列置換を行うにはどのようにすればよいのでしょうか?


【変換前】
0001:1,0001:2,0001:10-15,0002:2-3,0005:1

【変換後】
0001:1,0001:2,0001:10,0001:11,0001:12,0001:13,0001:14,0001:15,0002:2,0002:3,0005:1

回答の条件
  • 1人10回まで
  • 登録:2007/07/05 15:30:41
  • 終了:2007/07/12 15:35:04

回答(4件)

id:GEN111 No.1

GEN111回答回数472ベストアンサー獲得回数582007/07/05 16:08:55

ポイント23pt

こんな感じですかね。

function expand($exp) {
  $myarray = array() ;
  foreach (explode(',', $exp) as $one) {
    list($a, $b) = explode(':', $one) ;
    list($x, $y) = explode ('-', $b) ;
    do {
      array_push($myarray, "$a:$x") ;
      ++$x ;
    } while ($x <= $y) ;
  }
  return implode(',', $myarray) ;
}

$str = '0001:1,0001:2,0001:10-15,0002:2-3,0005:1' ;
echo expand($str) ;
id:vector_xenon No.2

vector回答回数113ベストアンサー獲得回数42007/07/05 16:42:57

ポイント23pt

処理としてはこんな感じでよいかと思います。

$arr = explode(',', $str);
$result = array();
foreach ($arr as $src) {
    list($key, $val) = explode($src, ':');
    // 一応NOTICE回避
    if (strpos('-', $val) !== fase) {
        list($start, $end) = explode('-', $val);
        for ($i = $start; $i <= $end; $i++) {
            $result[] = "{$key}:{$i}";
        }
    } else {
        $result[] = "{$key}:{$val}"
    }
}
$str = implode(',', $result);
id:kn1967 No.3

kn1967回答回数2915ベストアンサー獲得回数3012007/07/05 18:08:59

ポイント22pt
// 展開用サブルーチン
function fn_x($a,$b,$c){
    $ret = array();
    foreach(range($b,$c) as $n) { 
        array_push($ret,"$a:$n");
    }
    return(join(",",$ret));
}
//
// 元データ
$a = "0001:1,0001:2,0001:10-15,0002:2-3,0005:1";
//
// 置換実行
echo preg_replace("/(\d+):(\d+)-(\d+)/e","fn_x('$1',$2,$3)",$a);

ポイントはe装飾子をつけて2番目の引数を展開させてやることと、後方参照時に$1の値が数値に自動変換されてしまうのを防ぐために'で囲んでおいてやることの2点。

id:kn1967 No.4

kn1967回答回数2915ベストアンサー獲得回数3012007/07/05 23:36:05

ポイント22pt
// 展開用サブルーチン
function fn_x($a,$b,$c){ return(join(",",preg_replace("/(.+)/","$a:$1",range($b,$c)))); }
// 元データ
$a = "0001:1,0001:2,0001:10-15,0002:2-3,0005:1";
// 置換実行
echo preg_replace("/(\d+):(\d+)-(\d+)/e","fn_x('$1',$2,$3)",$a);

さらに煮詰めて短くしました。

foreachで回してた分を配列に対する一括置換に置き換えています。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません