Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Чем можно заменить AnsiPos?


Автор: Pcrepair 11.7.2012, 15:47
Добрый день. Есть код

Код

begin
    s:=Copy(HtmlCode,j,k-j);
    if (AnsiPos('http:',s)>0) or (AnsiPos('https:',s)>0) then
    if (AnsiPos('.doc',s)=0) and (AnsiPos('.pdf',s)=0) (*тут еще надо 
       много затычек на десятки типов файлов*)
    then
    T4.Add(s);
    i:=k;
    break;
end;


Код пропускает только строки содержащие http: и https: и не пропускает строки содержащие ссылку на закачку файла doc или pdf. но типов файлов может быть несколько десятков, не хотелось бы код типа (AnsiPos('.doc',s)=0) повторять десятки раз. кроме того желательно вынести наименования типов файлов в отдельный файл (типа INI?), что бы изменять список запретов оперативно и без перекомпиляции программы целиком

Вопрос: какими способами это можно сделать, если есть похожий функционально код опубликуйте, если не трудно, в теме.

Автор: XperT 11.7.2012, 16:43
Почитайте о регулярных выражениях

Автор: Данкинг 11.7.2012, 16:44
Я, как обычно, сделал бы список расширений в табличке DBF, и в ней уже искал.

Автор: Ne1tr1n0 11.7.2012, 17:12
Можно вынести список расширений в файл, необязательно INI, можно и просто в текстовом файле хранить, грузить потом из него в TStringList, потом циклом пробегаться по нему, если встретилось расширение в списке запрещенных, сразу же выходить из цикла (Break), перед тем же как добавлять в список, у тебя T4.Add(s), делать проверку если переменная последнего цикла меньше чем кол-во элементов в списке запрещенных расширений, то значит выход из цикла был совершен досрочно, => данный урл не попадает под оговариваемые условия и добавлять его не надо. Либо флаг какой завести, и в цикле проверки расширений его выставлять. А после цикла уже смотреть этот флаг.

То есть должно получиться что-то типа такого:
Код

var
  s: string;
  n, a: Integer;
  Ini: TStringList;
begin
try
  s:='http://forum.wingrad.ru.pdf';
  Ini:=TStringList.Create;
  Ini.LoadFromFile('C:\restricted_exts.txt');

  for n := 0 to Ini.Count - 1 do
  begin
    if AnsiPos(Ini[n],s) <> 0 then
      Break;
  end;

  if Not (n = Ini.Count) then
    ShowMessage('Restricted extension found') //здесь должны быть T4.Add(s) и т.д.
  else
    ShowMessage('Restricted extension not found')
finally
  Ini.Free;
end;

Только это слабенькая защитка такая получается. На сайтах типа http://www.pdftoword.com не сработает или https://www.docs.google.com/gview тоже пример.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)