Действительно, был не прав по поводу родного StringReplace. Посмотрел исходный код сей функции. У нас с авторами видимо разное представление о флаге rfReplaceAll. Вот первый вариант улучшенной функции StringReplace. Есть в ней один косяк при включенном флаге rfIgnoreCase, тут надо подумать. Но во всем остальном вроде нормально пашет. Если есть замечания, то выкладывайте свой вариант. Будем совместно править косяк Embarcadero
Код:
function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;
Var LS, RS, Pattern: String;
begin
Result := S;
Pattern := OldPattern;
if rfIgnoreCase in Flags
then begin
Result := AnsiUpperCase(S);
Pattern := AnsiUpperCase(OldPattern);
end;
while Pos(Pattern, Result) <> 0
do begin
LS := Copy(Result, 1, Pos(Pattern, Result)-1);
RS := Copy(Result, Pos(Pattern, Result) + Length(Pattern), Length(Result));
Result := LS + NewPattern + RS;
if not (rfReplaceAll in Flags) then Break;
if Result = S then Break;
end;
end;