FRstr - точная копия StringReplace используется на случай если StringReplace глючит для работы использует функцию copy (Delphi)
{ -----------------------------------------------------------------------------}
{ Это библиотека для работы с динамическими массивами (1D,2D) строк }
{ }
{ Версия 2.0 (GNU Lesser GPL v2.1) }
{ }
{ Основные функции: }
{ * Добавление, удаление элементов }
{ * Быстрая сортировка массива }
{ * Функции чтения и записи (файл <--> динамический массив) }
{ * Функции фильтрации текста и строк }
{ }
{ Примечание: использование этой библиотеки обусловлено ограниченностью числа }
{ элементов TStringList=129391, и специфичностью алгоритма сортировки }
{ TStringList одна буква z ставиться после длинного слова zoom т.е. zoom,z. }
{ }
{ -----------------------------------------------------------------------------}
{ Это свободная программа; вы можете повторно распространять ее и/или }
{ модифицировать ее в соответствии с Универсальной Общественной Лицензией GNU, }
{ опубликованной / Фондом Свободного ПО; либо версии 2, либо (по вашему выбору)}
{ любой более поздней версии. }
{ }
{ Эта программа распространяется в надежде, что она будет полезной, }
{ но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемых гарантий КОММЕРЧЕСКОЙ }
{ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. }
{ Для получения подробных сведений смотрите }
{ Универсальную Общественную Лицензию GNU. }
{ -----------------------------------------------------------------------------}
{ http://www.suny-o.narod.ru }
{ -----------------------------------------------------------------------------}
{ Date last modified: 21/10/2013 }
{ -----------------------------------------------------------------------------}
//FRstr точная копия StringReplace используется на случай если StringReplace глючит
//для работы использует функцию copy
function FRstr(FromStr, find1, replace1:string; flag:TReplaceFlags):string;
var first:boolean;
n,nf,find:integer;
s1,s2:string;
begin
first:=false;
result:='';
find:=0;
nf:=1;
for n := 1 to length(FromStr) do
begin
//Поиск фрагмента строки--------------------------------------------
//Поиск фрагмента строки без учета регистра [rfIgnoreCase]
if (flag=[rfIgnoreCase]) or (flag=[rfReplaceAll,rfIgnoreCase]) then
begin
if (find+1)>length(find1) then find:=0;
s1:=FromStr[n];
s2:=find1[find+1];
if AnsiLowerCase(s1)=AnsiLowerCase(s2) then
begin
find:=find+1;
end
else find:=0;
end
//--------------------------------------------------------
//Поиск фрагмента строки с учетом регистра []
else
begin
if (find+1)>length(find1) then find:=0;
s1:=FromStr[n];
s2:=find1[find+1];
if s1=s2 then
begin
find:=find+1;
end
else find:=0;
end;
//-------------------------------------------
//------------------------------------------------------------------
//Замена найденого фрагмента
if find=length(find1) then
begin
first:=true;
result:=result+copy(FromStr,nf,n-find-length(result))+replace1;
nf:=n+1;
end;
//Если не стоит флаг заменить все [rfReplaceAll] выходим из цикла поскольку 1 замена уже сделана
if (first=true) and ((flag=[]) or (flag=[rfIgnoreCase])) then
begin
if nf