質問

次のことを達成しようとしています:

$ 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
)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top