0

最初の針 (針の配列から) を置き換え、文字列内の残りの針を無視するように str_replace を実行したいと考えています。

これはそれをしません:

str_replace ( $needles, $replace , $mystring, 1 )

たとえば

$needles = array('#a#', '#b#');
$replace = array ('1', '2');
$mystring = "this #b# is #b# a test #a# string";

出力が次のようになるように $mystring を解析したい:

$mystring = "this 2 is a test string";

そのため、最初に見つかった針は置換配列で指定されたルールに従い、後続のすべての針は空白の文字列に置き換えられます。

私の考えを言葉で説明するのは難しいです。

4

3 に答える 3

2

私はあなたのためにかなり良い解決策を持っています(これも速いです)、ループは必要ありません:

$replace = array( //This will make your life really easy
    "#a#" => 1,
    "#b#" => 2
);

$pattern = "/(" . implode("|", array_keys($replace)) . ")/" ;
$string = "this #b# is #b# a test #a# string";

preg_match_all($pattern, $string, $matches);

$string = preg_replace("/{$matches[0][0]}/", "{$replace[$matches[0][0]]}", $string, 1);
$string = preg_replace($pattern, "", $string);

echo $string ;
于 2013-06-22T20:31:48.970 に答える
0
$needles = array('#a#', '#b#');
$replace = array('1', '2');
$mystring = "this #b# is #b# a test #a# string";

$start = PHP_INT_MAX;
foreach ($needles as $needle)
    if ((int)$start != ($start = min(strpos($mystring, $needle), $start)))
        $replacement = $replace[$key = array_flip($needles)[$needle]];
$mystring = str_replace($needles, "", substr_replace($mystring, $replacement, $start, strlen($needles[$key])));

出力:

var_dump($mystring);
// =>
string(25) "this 2 is  a test  string"
于 2013-06-22T20:10:43.183 に答える