文字列内のいくつかの数字を、この数字が指す位置にある配列の内容に置き換えたいと思います。
たとえば、 「Hello 1 you are great」を「Hello myarray[1] you are great」に置き換えます。
私は次のことをしていました:preg_replace('/(\d+)/','VALUE: ' . $array[$1],$string);
しかし、うまくいきません。どうすればできますか?
コールバックを使用する必要があります。
<?php
$str = 'Hello, 1!';
$replacements = array(
1 => 'world'
);
$str = preg_replace_callback('/(\d+)/', function($matches) use($replacements) {
if (array_key_exists($matches[0], $replacements)) {
return $replacements[$matches[0]];
} else {
return $matches[0];
}
}, $str);
var_dump($str); // 'Hello, world!'
コールバックを使用しているため、実際に数値を使用したい場合は、文字列を{1}
の代わりに または 何かとしてエンコードすることをお勧めします1
。変更された一致パターンを使用できます。
<?php
// added braces to match
$str = 'Hello, {1}!';
$replacements = array(
1 => 'world'
);
// added braces to regex
$str = preg_replace_callback('/\{(\d+)\}/', function($matches) use($replacements) {
if (array_key_exists($matches[1], $replacements)) {
return $replacements[$matches[1]];
} else {
// leave string as-is, with braces
return $matches[0];
}
}, $str);
var_dump($str); // 'Hello, world!'
ただし、既知の文字列を常に照合する場合は、ロジックを台無しにする機会が少ないため、@ChrisCooney のソリューションを使用することをお勧めします。
他の答えは完全に問題ありません。私はそれをこのように管理しました:
$val = "Chris is 0";
// Initialise with index.
$adj = array("Fun", "Awesome", "Stupid");
// Create array of replacements.
$pattern = '!\d+!';
// Create regular expression.
preg_match($pattern, $val, $matches);
// Get matches with the regular expression.
echo preg_replace($pattern, $adj[$matches[0]], $val);
// Replace number with first match found.
問題に対する別の解決策を提供するだけです:)
$string = "Hello 1 you are great";
$replacements = array(1 => 'I think');
preg_match('/\s(\d)\s/', $string, $matches);
foreach($matches as $key => $match) {
// skip full pattern match
if(!$key) {
continue;
}
$string = str_replace($match, $replacements[$match], $string);
}
<?php
$array = array( 2 => '**', 3 => '***');
$string = 'lets test for number 2 and see 3 the result';
echo preg_replace_callback('/(\d+)/', 'replaceNumber', $string);
function replaceNumber($matches){
global $array;
return $array[$matches[0]];
}
?>
出力
lets test for number ** and see *** the result