Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.02.2013, 14:06
Pcrepair
 
Сообщения: n/a
По умолчанию Удаление подстрок из строки за один проход

Добрый день. Есть функция на основе цикла FOR для удаления подстрок из строки за один проход

Код:
(*  09.02.2013  Функция удаления ненужных тегов с содержимым
  Список тегов: script; style; noscript; applet; object
  textarea; audio; button; canvas; comment; datalist; del;
  meter; noembed; optgroup; output; progress. удаление за один проход*)

function DelUseless(const Data:string):string;
var
I,EndTeg,Differ:integer;
Buffer:string; (*накопитель полезных символов*)
DefineTeg:string; (*первые 10 символов после <*)
begin
Differ:=0;
 if Length(Data) = 0 then Exit else
 for I := 1 to Length(Data) do

  begin
   if (Data[i] = '<') then  (*ловим открывающий символ*)
    begin
     DefineTeg:=Copy(Data, I,10); (*получаем десять символов от открывающего*)
      if (PosEx('<script', DefineTeg,1)= 0) then  (*если там нет '<script'*)
        Buffer:=Buffer+Data[i] (*копируем символ в буфер ЕСЛИ не <script*)
      else
        begin
          EndTeg:=PosEx('</script>',Data,I); (*определяем замыкающий тег*)
            if (EndTeg > 0) then Differ:=(EndTeg - I + 9); (* вычисляеи число символов от и до;*)
        end
        end
        else
          if (Differ = 0) then Buffer:=Buffer+Data[i] (*копируем посимвольно в буфер ЕСЛИ не <*)
          else Dec(Differ, 1) (*с каждым тактом в цикле уменьшаем счетчик числа символов в <script hghg>hghghgh</script>*)
  end;
 Result:=Buffer;
end;
Функция почемуто работает не совсем корректно, в частности строку
1<script>2</script>3 4<script>5</script>6
трансформирует в
1< 4<
а должно быть
13 46

Подскажите, кто в курсе, в чем ошибка?
З.Ы. Цикл FOR используется для того чтобы в затем ввести CASE при выборе тега для обработки и как самый быстрый вариант(один проход от первого символа до последнего в строке)
Ответить с цитированием
  #2  
Старый 10.02.2013, 14:18
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

а самому разобраться как работает функция и найти ошибку никак? не так уж и много строк.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 10.02.2013, 15:46
Pcrepair
 
Сообщения: n/a
По умолчанию

функция и так моя, разбирался как мог, теперь твоя очередь.
Ответить с цитированием
  #4  
Старый 10.02.2013, 15:53
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Смех

вот это читал:
Цитата:
Сообщение от Dimitry Sibiryakov
Эта процедура написана не программистом. Переписать с нуля.
???
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 10.02.2013, 16:00
Pcrepair
 
Сообщения: n/a
По умолчанию

вообщето там функция а не процедура
ну и сам по себе ответ какойто.... ну обойдемся без мата
если уж вылез кто со своим мнением, так уж поведай что конкретно не так, а обобщать не надо
Ответить с цитированием
  #6  
Старый 10.02.2013, 16:45
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

для Delphi 7 http://zalil.ru/34247888

Код:
uses
  Unit2,
...
Edit1.Text:=NumLockStr('1<script>2</script>3 4<script>5</script>6', 'script');
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #7  
Старый 10.02.2013, 16:59
Pcrepair
 
Сообщения: n/a
По умолчанию

и что это значит?
сделать декомпеляцию ДЦУ? предлагаешь? ХЕ3 этот файл не компилирует
если не в курсе что не так в приведеном коде конкретно, так и скажи. не надо придумывать какито другие версии функции, у меня их уже штук пять есть , все кстати работают. просто версия с циклом FOR, по теории должна работать быстрее всех?
Ответить с цитированием
  #8  
Старый 10.02.2013, 17:09
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Гораздо быстрее было бы что-нибудь вроде
Код:
i := 1;
while i < Length(s) do
begin
  if (i < Length(s) - 7) and (s[i] = '<') then
  begin
    if s.SubStr(i + 1, 6) = 'script' then
    begin
      j := PosEx('>', s, i + 7);
      if j > 0 then
      begin
        j := PosEx('</script>', s, j + 1);
        if j > 0 then
           i := j + 8
        else
           buf := buf + s[i];
      end
      else
           buf := buf + s[i];
    end;
  end
  else
     buf := buf + s[i];
  i := i + 1;
end;
Может в цифрах ошибся, но суть ясна.
А разбирать код, который был оформлен как будто под кайфом, нет желания.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 10.02.2013 в 17:12.
Ответить с цитированием
  #9  
Старый 10.02.2013, 17:12
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Смех

можно установить Delphi 7 на виртуалку и скомпилировать библиотеку dll с этим модулем, экспортировав функцию, если самому лень найти ошибку в 25 строчках кода.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #10  
Старый 10.02.2013, 17:17
Pcrepair
 
Сообщения: n/a
По умолчанию

да мне не лень, просто все варианты иссякли, просто видимо это то чего мне пока не известно.
Ответить с цитированием
  #11  
Старый 11.02.2013, 03:11
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

А вот такое будет правильно работать?
Код:
function DelUseless(Data, BegTeg, EndTeg: string): string;
var
i: integer;
f1, f2, f3, f4: boolean;
begin
 if Length(Data) = 0 then Exit;
 Result:= '';  f1:= false; f2:= false; f3:= false; f4:= false;

 for i := 1 to Length(Data) do
  begin
   if  (Data[i] = BegTeg[1]) and (not f1)
   and (copy(Data, i, Length(BegTeg) - 1) =
        copy(BegTeg, 1, Length(BegTeg) - 1)) then f1:= true;

   if (Data[i] = BegTeg[Length(BegTeg)]) and (f1) then f2:= true;

   if  (Data[i] = EndTeg[1]) and (f1) and (f2) and (not f3)
   and (copy(Data, i, Length(EndTeg) - 1) =
        copy(EndTeg, 1, Length(EndTeg) - 1))then f3:= true;

   if (Data[i] = EndTeg[Length(EndTeg)]) and (f1) and (f2) and (f3) then
   begin
    f1:= false; f2:= false; f3:= false; f4:= true;
   end;
 if (not f1)and(not f2)and(not f3)and(not f4) then Result:= Result + Data[i];
  if f4 then f4:= false;
  end;

end;
Здесь только нет обработки ошибки (по выходу копой за размерчик входной строки). Использование:
Код:
Edit1.Text:=
DelUseless('1<script 3007876>2</script 89008097>3 4<script defwwww>5</script hhhthtrew>6','<script>','</script>');

Символы "<" и ">" - заменяемо-основные, вдруг какие другие попадутся.

З.Ы. Циклом всё же медленнее, с while можно сразу пропустить лишние интерации, а с for такое не прокатит.

Последний раз редактировалось Alegun, 11.02.2013 в 18:15. Причина: Модернизация
Ответить с цитированием
  #12  
Старый 11.02.2013, 08:21
Pcrepair
 
Сообщения: n/a
По умолчанию

Alegun, спасибо за ответ, НО....
строка 1<script>2</script>3 4<script>5</script>6','<script>','</script> это специально упрощенный тест, просто пример. на самом деле тег script всегда имеет атрибуты, причем много. условно подстрока может иметь вид типа: <script ghghg>fcgfgfgfgfg</script>
не уверен что твой код обработает такие подстроки
Ответить с цитированием
  #13  
Старый 11.02.2013, 10:06
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

http://zalil.ru/34249929
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #14  
Старый 11.02.2013, 10:31
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Книгу по рег. выражениям дать?
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #15  
Старый 11.02.2013, 14:32
Pcrepair
 
Сообщения: n/a
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Книгу по рег. выражениям дать?
их у меня есть
но пока Я их не изучаю. рано еще.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:09.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025