質問
次のことを達成しようとしています:
$ subject = 'a b a';
$ search = 'a';
$ replace = '1';
望ましい結果:
配列
(
[0] => 1 b a
[1] => a b 1
)
preg_replaceでこれを達成する方法はありますか?
preg_replace( '/ \ b'。$ search。 '(?= \ s + | $)/ u'、$ replace、array($ subject));
同じ結果のすべての置換を返します:
配列
(
[0] => 1 b 1
)
乾杯
解決
それは不可能だと思います。オプションの4番目のパラメーターで置換の制限を指定できますが、それは常に先頭から始まります。
を使用して、探しているものを実現できます。 preg_split()
。検索パターンのあらゆる場面で文字列を分割し、それらを1つずつ混乱させる必要があります。検索パターンが単純な文字列である場合、 explode()
で同じことを実現できます。このアプローチを理解するのに助けが必要な場合は、喜んでお手伝いします。
編集:これがうまくいくかどうかを見てみましょう:
$subject = 'a b a';
$pattern = '/a/';
$replace = 1;
// We split the string up on all of its matches and obtain the matches, too
$parts = preg_split($pattern, $subject);
preg_match_all($pattern, $subject, $matches);
$numParts = count($parts);
$results = array();
for ($i = 1; $i < $numParts; $i++)
{
// We're modifying a copy of the parts every time
$partsCopy = $parts;
// First, replace one of the matches
$partsCopy[$i] = $replace.$partsCopy[$i];
// Prepend the matching string to those parts that are not supposed to be replaced yet
foreach ($partsCopy as $index => &$value)
{
if ($index != $i && $index != 0)
$value = $matches[0][$index - 1].$value;
}
// Bring it all back together now
$results[] = implode('', $partsCopy);
}
print_r($results);
注:これはまだテストされていません。動作するかどうか報告してください。
編集2 :
私は今あなたの例でそれをテストし、いくつかのことを修正し、現在は動作しています(少なくともその例では)。
他のヒント
function multipleReplace($search,$subject,$replace) {
preg_match_all($search, $subject,$matches,PREG_OFFSET_CAPTURE);
foreach($matches as $match) {
if (is_array($match)) {
foreach ($match as $submatch) {
list($string,$start) = $submatch;
$length = strlen($string);
$val = "";
if ($start - 1 > 0) {
$val .= substr($subject,0,$start);
}
$val .= preg_replace($search,$string,$replace);
$val .= substr($subject,$start + $length);
$ret[] = $val;
}
}
}
return $ret;
}
$search = 'a';
print_r(multipleReplace('/\b'.$search.'(?=\s+|$)/u','a b a','1'));
出力
Array
(
[0] => 1 b a
[1] => a b 1
)
所属していません StackOverflow