0

このスニペットに関するアドバイスが必要です

$text = preg_replace('|(A.*)?A(.*)C|', '$1foo$2bar', $text);

これは「ABABCD」のABCと一致し、「ABfooBbarD」に置き換えられます。ご覧のとおり、これは最初の「AB」の部分にも一致します。これは、失わないように、$1の置換文字列で繰り返す必要があります。

これはそのような結果を得るための最良の方法ですか?

次のようなフラグXはありますか

$text = preg_replace('|A(.*)C|X', 'foo$1bar', $text); 

同じ結果が得られますか?

はっきりしているといいのですが

ありがとうございました!

編集:A、B、Cを任意の文字のアトミック文字列と見なし、空白を含めることもできます

また、提示された例は、「ABC ABC」の2番目の「ABC」にのみ一致するため、実際にはバグがあります。

EDIT2:申し訳ありませんが、私はおそらく問題を非常にひどく説明しました。重要なのは、2つのA、C文字列の間にあるものをすべて一致させて、一致にサブ文字列Aがないようにすることです。

もう一度ありがとう

4

3 に答える 3

1

これはどう:

$text = preg_replace('|A(\S*)C|', 'foo$1bar', $text);

\S空白以外の文字に一致するため、異なる単語間で置換することはありません。


OPのコメントのいくつかを見た後、別の推測を危険にさらします:

$text = preg_replace('|A(B)C|', 'foo$1bar', $text);
于 2009-02-08T13:18:33.223 に答える
1

*量指定子の貪欲でないバージョンを使用します。

$text = preg_replace('|(.*)(A.*?C)|', '$1foo$2bar', $text);
于 2009-02-08T13:22:01.500 に答える
0

質問が明確になったので、次の表現を試してください。

preg_replace('/(?:A)+(.+?)(?:C)+/', 'foo$1bar', $text)

例:

$A = 'abc'; $B = '123'; $C = 'xyz';
$text = "$A$B$C $A$A$B$C $A$B$C$C";
echo preg_replace("/(?:$A)+(.+?)(?:$C)+/", 'foo$1bar', $text);
于 2009-02-08T13:25:47.470 に答える