Statistik  Mitglieder gesamt: 68138  Mitglieder online: 6  Gäste online: 6 mehr...
Anzeige
| Thread: Satzzeichen/Sonderzeichen
 20.09.2008 18:02 Uhr
|
|
|
|
|
Hallo,
Ich hab mal wieder Probleme mit meinem Anmeldeformular.
Und zwar kann man keinerlei Zeichen wie ä, ö, ü, ß verwenden. Das wäre ja grade noch in Ordnung, nun kann man aber auch keine Satzzeichen wie . , ; : ? ( ) /usw. Verwenden und das ist, da ich ein Textfeld habe, sehr ungünstig.
Kann mir irgendjemand sagen, was ich machen muss, damit das funktioniert?
Das Formular sieht folgendermaßen aus: php:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
| <?php
function ErrorHandler($field,&$ok)
{
echo "das Feld: ".$field."ist leer oder enthät einen falschen Inhalt.<br>\n";
$ok = false;
}
function MailItToMaster($attribTypeList,$name_attrib)
{
$headers = 'From: formular@yoga-mobil.com' . "\r\n" .
'Reply-To: noreply@yoga-mobil.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
$receiver = 'kurse@yoga-mobil.com';
$subject = 'Neue Anmeldung von yoga-mobil.com! Datum: '.date('H:i:s d.m.y');
$message = 'Datum: '.date('H:i:s d.m.y')."\n\n";
$message.= 'Soeben erfolgte eine neue Anmeldung auf http://www.yoga-mobil.com nachfolgend finden sie die Details zur Anmeldung:'."\n\n\n";
$post_keys = array_keys($_POST);
for($i=0;$i<sizeof($_POST);$i++)
{
if(!in_array($name_attrib[$i][0],$attribTypeList))
continue;
$message.= $name_attrib[$i][1]. ":\t\t\t\t\t". $_POST[$post_keys[$i]]."\n";
}
$message = wordwrap($message,70);
mail($receiver,$subject,$message,$headers);
}
function MailItToClient($attribTypeList,$name_attrib,$clientMail)
{
$headers = 'From: formular@yoga-mobil.com' . "\r\n" .
'Reply-To: kurse@yoga-mobil.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
$receiver = $clientMail;
$subject = 'Ihre Anmeldung bei Yoga Mobil (http://www.yoga-mobil.com) | Datum: '.date('H:i:s d.m.y');
$message = 'Datum: '.date('H:i:s d.m.y')."\n\n";
$message.= 'Sie haben sich soeben für Yoga Mobil angemeldet. Nachfolgend finden sie eine Zusammenfassung ihrer eingegebenen Daten.'."\n\n\n";
$post_keys = array_keys($_POST);
for($i=0;$i<sizeof($_POST);$i++)
{
if(!in_array($name_attrib[$i][0],$attribTypeList))
continue;
$message.= $name_attrib[$i][1]. ":\t\t\t\t\t". $_POST[$post_keys[$i]]."\n";
}
$message.= "\n\n\n".'Vielen Dank für ihre Anmeldung. Für weitere Fragen wenden sie sich bitte an kurse@yoga-mobil.com.';
$message = wordwrap($message,70);
mail($receiver,$subject,$message,$headers);
}
$name_attrib = array();
$attribTypeList = array(
"text",
"number",
"email",
"radio",
"date"
);
$post_keys = array_keys($_POST);
$post_data = $_POST;
$ok = false;
if(isset($_POST['submit::']))
{
$ok = true;
for($i=0; $i<sizeof($_POST); $i++)
{
if(!preg_match('/(\w*):(.*):(\*?)/',$post_keys[$i]))
{
echo "Fehlerhaftes Formular!\n";
echo "fehler bei key: ".$post_keys[$i];
$ok = false;
break;
} else {
$name_attrib[$i] = explode(":",$post_keys[$i]);
if(!in_array($name_attrib[$i][0],$attribTypeList))
continue;
if(trim($name_attrib[$i][2]) == "*")
{
if(empty($_POST[$post_keys[$i]]))
{
echo "Das Pflichtfeld ".$name_attrib[$i][1]." darf nicht leer sein.<br>\n";
$ok = false;
} else {
switch($name_attrib[$i][0])
{
case "text":
if(!preg_match('/^[\w\s]+$/',$_POST[$post_keys[$i]]))
{
ErrorHandler($name_attrib[$i][1],$ok);
}
break;
case "number":
if(!preg_match('/^(\d+)$/',$_POST[$post_keys[$i]]))
{
ErrorHandler($name_attrib[$i][1],$ok);
}
break;
case "email":
$clientMail = $_POST[$post_keys[$i]];
if(!preg_match('/^([\w\.\-]+)@(([A-Za-z0-9-]+)\.){1,4}([\w]+)$/',$_POST[$post_keys[$i]]))
{
ErrorHandler($name_attrib[$i][1],$ok);
}
break;
case "radio":
break;
case "date":
if(!preg_match('/\d\d\.\d\d\.\d\d\d\d/',$_POST[$post_keys[$i]]))
{
ErrorHandler($name_attrib[$i][1],$ok);
}
break;
default:
echo "Fehler!\n";
$ok = false;
break;
}
}
} else {
if(!empty($_POST[$post_keys[$i]]))
{
switch($name_attrib[$i][0])
{
case "text":
if(!preg_match('/^[\w\s]+$/',$_POST[$post_keys[$i]]))
{
ErrorHandler($name_attrib[$i][1],$ok);
}
break;
case "number":
if(!preg_match('/^(\d+)$/',$_POST[$post_keys[$i]]))
{
ErrorHandler($name_attrib[$i][1],$ok);
}
break;
case "email":
$clientMail = $_POST[$post_keys[$i]];
if(!preg_match('/^([\w\.\-]+)@(([A-Za-z0-9-]+)\.){1,4}([\w]+)$/',$_POST[$post_keys[$i]]))
{
ErrorHandler($name_attrib[$i][1],$ok);
}
break;
case "radio":
break;
case "date":
if(!preg_match('/\d\d\.\d\d\.\d\d\d\d/',$_POST[$post_keys[$i]]))
{
ErrorHandler($name_attrib[$i][1],$ok);
}
break;
default:
echo "Fehler!\n";
$ok = false;
break;
}
}
}
}
}
if($ok)
{
MailItToMaster($attribTypeList,$name_attrib);
MailItToClient($attribTypeList,$name_attrib,$clientMail);
echo "Ihre Anmeldung wurde verschickt.<br>\n";
echo "<a href=\"http://www.yoga-mobil.com/begin.php?mode=formular\">Zurück</a>";
}
}
echo "<pre>";
print_r($name_attrib);
print_r($_POST);
print_r($attribTypeList);
print_r($post_data);
echo "</pre>";
?> |
Ich hoffe mir kann jemand helfen :)
 1 mal bearbeitet brott: 21.09.2008, 10:52 Uhr
|
|
 20.09.2008 22:58 Uhr
|
|
|
|
|
lass mich raten: ist nicht selbst geschrieben ;-)
versuch mal die Eingaben mit htmlentities zu maskieren, dann dürfte kein Zeichen mehr ein Problem darstellen...
|
|
 20.09.2008 23:12 Uhr
|
|
|
|
|
@Ellefant
Pack deinen Code mal bitte in Code Tags, anstatt Zitat Tags.
Das ist ja abartig, das zu lesen.
___________________________ Visit: www.sim4000.de
Ein ball rollt um die Ecke und fällt um.
Intelligenz ist, wenn mein weiß, dass man doof ist.
|
|
 21.09.2008 00:12 Uhr
|
|
|
|
|
In der Tat ist der Code schwer zu lesen. Aber ich glaube das liegt weniger am fehlenden Syntax-Highlighting... Besonders interessant finde ich die Überprüfung der Variablen.
Ohne den Code richtig entziffern zu können tippe ich eher darauf, dass der reguläre Ausdruck zum Testen von "text" etwas zu streng ist. Genaugenommen meine ich die ganzen Vorkommen von: PHP:1
2
3
4
5
6
7
8
9
| <?php
[...]
case "text":
if(!preg_match('/^[\w\s]+$/',$_POST[$post_keys[$i]]))
{
ErrorHandler($name_attrib[$i][1],$ok);
}
break;
[...] |
Wenn ich den Code richtig verstanden habe, dann müsste der reguläre Ausdruck zum Testen von Text einschließlich Sonderzeichen eher so aussehen: Wenn die zu testenden Formulardaten nämlich mit dem Schnipsel oben getestet werden, dann trifft der Ausdruck nur dann zu, wenn der zu testende String nur Wortzeichen (\w) und nicht-sichtbare Zeichen (\s) enthält. Sobald andere Zeichen (Sonderzeichen, etc) vorhanden sind, trifft natürlich der Ausdruck nicht mehr zu, und an der Stelle wäre dann Ende.
Allerdings ist eigentlich gar keine überprüfung notwendig, wenn eh nur Reintext erlaubt ist. Einfacher wäre es, wenn du einfach trim, striptags, etc drüberlaufen lässt und guckst, ob der String anschließend eine vorgegebene Mindestlänge erreicht.
___________________________ Programmieren ist eine Sucht deren Rausch ein Gefühl der Macht ist... sofern man den Computer bezwingt. Gefährliche Nebenwirkungen: Verstärkter Kaffee-Konsum, erhöhter Ehrgeiz und ggf. Wutausbrüche und verknotete Gehirnwindungen.
|
|
 28.09.2008 18:25 Uhr
|
|
|
|
|
@schafholt: Richtig. Ich wollte es ursprünglich selbst schreiben, aber jemand den ich kenne und der behauptet er kann das meinte dann, dass er mir das "schnell" machen könnte. Das hat dann schon mal sehr lange gedauert und er kann mir auch nicht sagen woran das liegt. Und ich hab jetzt aber so gut wie keine Ahnung über das Formular, wie das richtig funktioniert und so... er meinte nur, dass es sehr variabel ist und man es für egal welches Formular nehmen könnten (natürlich müsste man dann entsprechende Angaben verändern, aber nicht soo viel)
@HangMan: Kannst du mir nochmal erklären was du genau meintest? Soll ich dann "[\w\s]" weglassen, oder wie? ;)
Entschuldigt meine Dummheit, aber ich kenn mich mit PHP so gut wie nicht aus.....
|
|
 28.09.2008 23:07 Uhr
|
|
|
|
|
Hallo Elena (?), von Dummheit sagt hier keiner was. Die kann man nicht an der Fähigkeit PHP "zu sprechen" messen
Zitat: [...]und er kann mir auch nicht sagen woran das liegt.[...]er meinte nur, dass es sehr variabel ist und man es für egal welches Formular nehmen könnten
Wenn man es nicht intuitiv verwenden kann, halte ich es eher für unbrauchbar. Dazu kommt noch, dass es auf den ersten Blick keinesfalls zur Wiederverwendbarkeit geeignet ist.
Das "[\w\s]+" könntest du vorerst durch ".+" ersetzen. Dadurch werden alle Zeichen zugelassen, es muss aber mindestens eins angegeben sein. Voraussetzung ist, dass ich diesen Code richtig verstanden habe. Problematisch ist dann nur noch, wenn der User nur Leerzeichen angibt, oder nur irgendwelche sinnfreien Kombinationen aus (*) Sonderzeichen. Vielleicht poste ich die Tage mal einen Codeschnipsel. Momentan ist leider mein 48h-Tag zu knapp...
Edit: (*) Da ist mir wohl ein Wort abhanden gekommen. Eine Sprachanalyse ist sicherlich bei Formularen nicht angebracht, da der Nutzwert den hohen Implementationsaufwand sicher nicht rechtfertigt.
 1 mal bearbeitet ___________________________ Programmieren ist eine Sucht deren Rausch ein Gefühl der Macht ist... sofern man den Computer bezwingt. Gefährliche Nebenwirkungen: Verstärkter Kaffee-Konsum, erhöhter Ehrgeiz und ggf. Wutausbrüche und verknotete Gehirnwindungen.
|
|
 28.09.2008 23:43 Uhr
|
|
|
|
|
Zitat: er meinte nur, dass es sehr variabel ist und man es für egal welches Formular nehmen könnten (natürlich müsste man dann entsprechende Angaben verändern, aber nicht soo viel) Für Wiederverwendbarkeit würden alle veränderbaren Werte wohl irgendwo an zentraler Stelle stehen, damit man sie immer wieder findet, aber bei dem Script stehen die Texte ja alle mittendrin. Für gute Wiederverwendbarkeit würde man das wahrscheinlich über Klassen realisieren, aber das Thema sollte man vielleicht besser weglassen, Hangman musste erst kürzlich erfahren, wie viele Folgeprobleme daraus resultieren können, wenn der Hilfe-Suchende sich nicht mit auskennt.
Zitat: Problematisch ist dann nur noch, wenn der User nur Leerzeichen angibt
Könnte man ja vorher einfach mit trim() bearbeiten (wahlweise auch so senden oder nur zum Testen, ob Zeichen da sind).
Für ersteren Fall also sowas (deinen Vorschlag mit .+ übernehmend): PHP:1
2
3
4
5
| <?php
if(!preg_match('/^.+$/',trim($_POST[$post_keys[$i]])))
{
[...]
} |
Zitat: oder nur irgendwelche sinnfreien Kombinationen aus
Das würde dann schon etwas weiterreichen. Einfachste Möglichkeit wäre sicherlich zu prüfen, ob so grob gesehen immer mal wieder ein Leerzeichen kommt.
Weiterführend könnte man sprachliche Analysen durchführen, welche die Häufigkeit von bestimmten Zeichen prüfen (z.B. viele Vokale oder unverhältnismäßig wenige wie in kfdjklkskasfl). Da gibt es natürlich noch viel bessere Methoden, welche man auch zur Erkennung von Sprachen verwenden kann. Ich habe erst kürzlich eine pdf-Datei über eine Methode gelesen, mit der sich anscheinend auch bei ganz kurzen Texten (2-3 Wörter) die Sprache sehr gut ohne Wörterbuch analysieren ließ. Das basierte irgendwie auf Folgen von Buchstaben (2 oder 3 Buchstaben am Stück), welche in verschiedenen Sprachen verschieden häufig vorkommen, wenn ich das noch richtig in Erinnerung habe. Aber das ginge zu weit
post scriptum: So, aus 11:30 wurde nun doch wieder 11:45.. Ich schaffe es wirklich nie, vor dieser Zeit ins Bett zu gehen, irgendetwas findet sich immer noch...
 2 mal bearbeitet
|
|
 03.10.2008 12:19 Uhr
|
|
|
|
|
Vielen Dank für eure Hilfe!!!!
Jetzt funktioniert es perfekt... (man kann ä, ö, ü, ß und alle Satzzeichen schreiben) . Suuuuuuper :)
|
|
|