文字列内の異なる部分文字列を複数の異なる文字列に置き換えたいのですが、労力をかけて使用するよりも良い方法はありますか
str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )
交換する弦の数だけ?
例:任意のサンプル文字列a, b and c
でそれぞれを置き換えます。d, e and f
もちろん、これには変更する必要がある単語がたくさんあります。
文字列内の異なる部分文字列を複数の異なる文字列に置き換えたいのですが、労力をかけて使用するよりも良い方法はありますか
str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )
交換する弦の数だけ?
例:任意のサンプル文字列a, b and c
でそれぞれを置き換えます。d, e and f
もちろん、これには変更する必要がある単語がたくさんあります。
str_replace()は、検索パラメーターと置換パラメーターの両方の配列を受け入れるため、検索する配列にいくつかの文字列を渡すことができ、次のように、置換パラメーターに渡された配列内の対応する文字列に置き換えられます。
$search = array('a','b','c');
$replace = array('d','e','f');
$res = str_replace($search, $replace, 'a b cool');
echo $res; //echoes 'd e fool'
これを行う通常の方法は、翻訳の配列を提供することです
$xlat = array(
'a' => 'd',
'b' => 'e',
'c' => 'f',
);
そしてそれをに渡しますstr_replace
:
$result = str_replace(array_keys($xlat), array_values($xlat), $source);
SQL クエリまたはその他のソースから配列を作成できます。
ソース文字列セットと置換文字列セットの間に共通点がある場合、またはソース文字列間に内部一致がある場合には注意が必要です。
'Alpha' => 'Beta',
'Beta' => 'Gamma',
またはさらに卑劣な、
'Alpha' => 'Beta',
'Alphabet' => 'ABCDEFGHIJ',
内部str_replace
でループを使用しているため、「ベース アルファ」は「ベース ガンマ」として出力され、「アルファベット」は「ABCDEFGHIJ」ではなく「ベタベット」として出力されます。これに対処する 1 つの可能な方法は、$xlat
インクリメンタルにビルドすることです。新しい対 'a' => 'b' で 'a' が既に の値にあることがわかった場合は、 を追加する代わりにプッシュ$xlat
することができます。もちろん、より複雑なキーワードのセット (または2 つ以上の用語の交換) は解決できない場合があります。$xlat
もう 1 つの方法は、2 回実行することです。最初に次$xlat1
の形式の配列を生成します。
'a' => '###<UNIQUEID1>###',
'b' => '###<UNIQUEID2>###',
および次の形式の 2 番目の配列
'###<UNIQUEID1>###' => 'c',
'###<UNIQUEID2>###' => 'd',
ループを使用して、最初の 1 つの配列形式を 2 番目の配列形式に「アップグレード」できます。
// First step, we sort $xlat in order of decreasing key size.
// This ensures that *Alphabet* will be replaced before *Alpha* is ever checked.
// Then we build
foreach($xlat as $from => $to)
{
$id = uniqid();
$xlat1[$from] = $id;
$xlat2[$id] = $to;
}
$temp = str_replace(array_keys($xlat1), array_values($xlat1), $source);
$result = str_replace(array_keys($xlat2), array_values($xlat2), $temp);