AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Stringfilter

Offene Frage von "blooddog_90"
Ein Thema von blooddog_90 · begonnen am 27. Jun 2009 · letzter Beitrag vom 28. Jun 2009
Antwort Antwort
Seite 2 von 2     12
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#11

Re: Stringfilter

  Alt 28. Jun 2009, 03:47
@Oreaden: Und um dein Exempel zu statuieren bietest du dem Fragesteller hier übertrieben minimalistischen Code an (der Funktionsname sticht hier schon besonders hervor), wobei er mit recht großer Wahrscheinlichkeit die andere Diskussion garnicht kennt? Da wurde der Disput wohl auf dem falschen Rücken weiter ausgetragen, oder? Das finde ich ist schon eher etwas zum nochmal drüber nachdenken.
Das ist übrigens ein gutes Beispiel für das, was ich in dem anderen Thread mit "Maß halten" meinte. Das gilt nämlich für beide Extreme.
Zudem ist der Kontext hier nicht so weit definiert (mathematische Symbolik vs. "es geht um Strings"), als dass man von allgemein verständlichen Konventionen ausgehen könnte. Oder haben "f", "s" und "a" in der String-Theorie () eine feste Bedeutung?
(Wobei ich jedoch gern zugeben möchte, dass die Kürze der Funktion eine einfache Symbolik begünstigt. Der Funktionsname ist hier mein eigentlicher Stein des Anstoßes.)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#12

Re: Stringfilter

  Alt 28. Jun 2009, 05:44
Zitat von himitsu:
Delphi-Quellcode:
procedure FilterText( var Text: String; BadChars: Set of Char );
var
  i: Integer;
begin
  for i := Length(Text) downto 1 do
    if Text[i] in BadChars then
      Delete(Text, i, 1);
end;
Aufruf wie schon bei Aphton
Wie dumm von mir ...

Mir sind die "Set of" Dinger nicht eingefallen

Himitsu, so wie du das aber programmiert hast, wirds nicht funzn..
Hab ein wenig damit rumgespielt:

Delphi-Quellcode:
type
  TSetOfChar = Set of Char;

//--

procedure FilterText( var Text: String; const BadChars: TSetOfChar );
var
  i: Integer;
begin
  for i := Length(Text) downto 1 do
    if Text[i] in BadChars then
      Delete(Text, i, 1);
end;
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Oreaden

Registriert seit: 10. Nov 2008
60 Beiträge
 
#13

Re: Stringfilter

  Alt 28. Jun 2009, 10:13
Zitat von Medium:
Zudem ist der Kontext hier nicht so weit definiert (mathematische Symbolik vs. "es geht um Strings"), als dass man von allgemein verständlichen Konventionen ausgehen könnte. Oder haben "f", "s" und "a" in der String-Theorie () eine feste Bedeutung?
(Wobei ich jedoch gern zugeben möchte, dass die Kürze der Funktion eine einfache Symbolik begünstigt. Der Funktionsname ist hier mein eigentlicher Stein des Anstoßes.)
hallo medium,

in welchem bereich bist du tätig?

ja, die bezeichnungen sind eindeutig, f() = eine funktion, s = source/string und a ist das array oder parameter... o.k. den parameter hätt ich wohl besser p bezeichnen sollen...

wo liegt das problem? es geht doch hier nur um eine funktion... die braucht man doch nicht durchnummerieren...

btw: geht doch der ganze thread nur um einen filter... weshalb muss man da dann 1000 das gleiche hinschreiben... ist irgendwie zu mühsamm...

schöne grüsse vom orakel
Oreaden

btw: die informatik hat sich auch von der mathematik abgespalten... somit verstehe ich nicht, was du hier meinst mit stringtheorie und mathematik...
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#14

Re: Stringfilter

  Alt 28. Jun 2009, 10:56
So Leute, nachdem wir uns ja im Thread zum Thema 'Horner-Schema' ausreichend mit dem Sinn und Unsinn von Namens- und Formatierungskonventionen augelassen haben, schlage ich vor, das diejenigen, die weiterhin darüber diskutieren wollen, sich entweder in eine Kneipe ihrer Wahl verdünnisieren oder einen separaten Thread aufmachen, um sachlich über dieses an sich sehr wichtige Thema zu diskutieren.

Hier sollte es nur noch um eine Filterfunktion gehen, die entweder unerwünschte Zeichen aus einem String entfernt, oder prüft, ob ein String ungültige Zeichen enthält. Es gibt bezüglich der vorgestellten Funktionen genug Diskussionsstoff (Performance, Eleganz, Allgemeingültigkeit etc.)
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#15

Re: Stringfilter

  Alt 28. Jun 2009, 11:19
ich frag mich sowieso wieso ein Set of WideChar nicht geht ... wären doch nur 8 KB, aber da eh nicht alle Unicode nutzen und man ja nicht unbedingt alles auf Unicode umbrechen muß ...

so wäre es dann unicodetauglich und es würden alle Zeichen entfernt, welche in BadChars dinn sind und nicht in ANSI reinpassen, egal welche Codierung ANSI hatt
Delphi-Quellcode:
procedure FilterText(var Text: String; const BadChars: TSysCharSet);
var
  i: Integer;
begin
  for i := Length(Text) downto 1 do
    if (Text[i] in BadChars) or not (Text[i] in [#$0000..#$00FF]) then
      Delete(Text, i, 1);
end;

// bzw.

procedure FilterText(var Text: String; const BadChars: TSysCharSet);
var
  i: Integer;
begin
  for i := Length(Text) downto 1 do
    if (Text[i] in BadChars) or (Text[i] > #$00FF) then
      Delete(Text, i, 1);
end;
eigentlich müßte Ersteres eher stimmen, aber es scheint mit Letzterem übereinzustimmen ... schon eigenartig

[add]
so sollte es dann keine Wiedersprüche geben
Delphi-Quellcode:
procedure FilterText(var Text: String; BadChars: TSysCharSet);
var
  i: Integer;
begin
  BadChars := [#$0000..#$00FF] - BadChars;
  for i := Length(Text) downto 1 do
    if not (Text[i] in BadChars) then
      Delete(Text, i, 1);
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Oreaden

Registriert seit: 10. Nov 2008
60 Beiträge
 
#16

Re: Stringfilter

  Alt 28. Jun 2009, 12:34
@himitsu: mhhh, 'ne ansi funktion... hier mal etwas, was auch chinesische zeichen ordentlich rausfiltert... ;-9

Delphi-Quellcode:
procedure f(var s, p: string);
var
  x: string;
  c: char;
  i: integer;
begin
  if (length(s) = 0) or (length(p) = 0) then exit;
  x := s;
  s := EmptyStr;
  setlength(s, length(x));
  i := 0;
  for c in x do
    if pos(c, p) = 0 then
    begin
      inc(i);
      s[i] := c;
    end;
  setlength(s, i);
end;
ob's jemand braucht, ist 'ne andere frage

btw: TSysCharSet = set of ansichar
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#17

Re: Stringfilter

  Alt 28. Jun 2009, 12:37
Dieser Code ersetzt alle verbotenen Zeichen durch ein Ersatzzeichen:

Delphi-Quellcode:
const
  VerboteneZeichen = 'äÄöÖüÜß: !';
  ErsatzZeichen = '_';
var
  s: String;
  c: Char;
  i: Integer;
begin
  s := 'Müller sagte: Hallo Welt!'; //der Satz

  ShowMessage('Original: ' + s);

  for i := 1 to Length(VerboteneZeichen) do
  begin
    c := VerboteneZeichen[i]; //immer nur ein Zeichen

    while Pos(c, s) > 0 do
      s[Pos(c, s)] := ErsatzZeichen;
  end;

  ShowMessage('Verändert: ' + s);
end;
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#18

Re: Stringfilter

  Alt 28. Jun 2009, 12:49
Hier eine Funktion die ich mal zur Überprüfung von Pfaden geschrieben habe:

Delphi-Quellcode:
function IsValidPath(s: String): Boolean;
var
  i: Integer;
  t: String;
begin
  Result := False;

  if Length(s) < 1 then Exit;
  if s[Length(s)] <> '\then s := s + '\';
  if not (((s[1] in ['a'..'z', 'A'..'Z']) and (Copy(s, 2, 2) = ':\')) or
    (Copy(s, 1, 2) = '\\')) then Exit;
  if Copy(s, 1, 2) = '\\then Delete(s, 1, 2) else Delete(s, 1, 3);

  while Length(s) > 0 do begin
    t := Copy(s, 1, Pos('\', s) - 1);
    if t = 'then Exit;
    for i := 1 to Length(t) do if Pos(t[i], '\/:*?"<>|') > 0 then Exit;
    Delete(s, 1, Pos('\', s));
  end;

  Result := True;
end;
Ist schon paar Jahre alt, aber ich denke, daß sie funktionierte.

Übrigens, wenn du eine Funktion suchst die überprüft ob Bezeichner aus diesen Buchstaben besteht: 'A'..'Z', 'a'..'z', '0..'9', '_', dann gibt es bereits eine fertige Funktion:

  if not IsValidIdent(s) then ...
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#19

Re: Stringfilter

  Alt 28. Jun 2009, 13:00
Hier noch etwas allgemeines, aus meiner Funktionskiste:

Delphi-Quellcode:
function IsValidStr(s: String): Boolean;
const
  ValidChars = ['0'..'9', 'A'..'Z', 'a'..'z'];
var
  i: Integer;
begin
  Result := False;

  if Length(s) < 1 then Exit;
  for i := 1 to Length(s) do
    if not (s[i] in ValidChars) then Exit;

  Result := True;
end;
Welche Zeichen erlaubt sind steht in ValidChars.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz