2011-02-01 10 views
1
$replaces = array('replace 1', 'replace thing 2', 'third replace'); 

$string = '{REPLACEME} sfsfsdfsdf {REPLACEME} sdfopjsd {REPLACEME} sdfsdf {REPLACEME}'; 

それぞれの連続する{REPLACEME}を一致する置換えに置き換える最も簡単な方法は何ですか?文字列中の文字列の同じインスタンスを配列で置き換える方法は?

代替品よりも{REPLACEME}が多い場合は、{REPLACEME}には触れないでください。

私は私の例でたい出力があるので:

$replaces = array('replace 1', 'replace thing 2', 'third replace'); 
$string = '{REPLACEME} sfsfsdfsdf {REPLACEME} sdfopjsd {REPLACEME} sdfsdf {REPLACEME}'; 
$sampler = explode('{REPLACEME}',$string); 
foreach($sampler as $k=>$v){ 
if(isset($replaces[$k])) { 
    $sampler[$k] .= $replaces[$k] 
} else { 
    $sampler[$k] = '{REPLACEME}' //or whatever 
} 
} 
$final = implode("",$sampler); 
//it's ok for not so long strings or at least not to many {REPLACEME} 

答えて

8
foreach($replaces as $rep) { 
    $string = preg_replace('~\{REPLACEME\}~',$rep,$string,1); 
} 
+0

リミットパラメータをうまく使います! – gravelpot

+0

ええと...私はいつもstr_replace()に似たようなパラメータがないのか疑問に思っています... –

+1

'foreach'の繰り返しごとに、文字列全体が' {REPLACEME} 'のために検索されます。置換文字列にもその文字列が含まれている場合、置き換えられます。 – Gumbo

2

これは速いかもしれません十分な置換文字列:

$parts = explode('{REPLACEME}', $string, count($replaces)+1); 
for ($i=0, $n=count($parts); $i<$n; $i++) { 
    $parts[$i] .= $replaces[$i]; 
} 
$string = implode('', $parts); 

検索の正規表現が必要な場合はexplodeの代わりにpreg_splitを使用できます。 str_replace/preg_replaceを複数回呼び出すことに反対で、このソリューションの

利点が連続している:

  • $string{REPLACEME}(せいぜいcount($replaces))の出現をたらのみ検索され
  • {REPLACEME}ありません前回の交換時に表示された場合は交換する$replaces
+0

に投稿の書式を設定する方法を学んでください:http://stackoverflow.com/編集ヘルプ – BoltClock

+0

^^ BoltClockは言った。 ;-) –

1
Catalin Marin’s proposalに似

が、そこかどうかをチェックする必要はない:

replace 1 sfsfsdfsdf replace thing 2 sdfopjsd third replace sdfsdf {REPLACEME} 
関連する問題