String auf Zeichengebung prüfen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
buchstabe
code
einzelnen zeichen
formulieren
funktion
http
komma
leeren string
machen
manual
match
maximal zwei
punkt
stehen
string
type
url
zahl
zeichen
zusammenstellen
-
Hi, ich will ein String auf die Zeichen, die darin geprüft werden prüfen. Das selbe auch mit einer Zahl. Bei der Zahl kann ich ja einfach prüfen:
if($var==(int) $var) { // mach was } else { die(); }
Aber wie mache ich das mit den Strings? Sie sollen folgende Werte enthalten dürfen, alles andere muss weg:
a-z
A-Z
0-9
-
_
Punkte, Kommas, Shlas und vorallem auch Hexadezimale Zeichen müssen weg. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Das geht mit der preg_match() funktion.
http://de3.php.net/manual/de/function.preg-match.php
dafür musste dann halt eine regex formulieren und übergeben. Kann dir da auch nicht weiterhelfen da RegEx nicht meine Stärke ist =/ -
myhead schrieb:
Das geht mit der preg_match() funktion.
http://de3.php.net/manual/de/function.preg-match.php
dafür musste dann halt eine regex formulieren und übergeben. Kann dir da auch nicht weiterhelfen da RegEx nicht meine Stärke ist =/
Die Funktion kenne ich, aber ich kenne mich nicht mit Regex aus. Deswegen habe ich ja gefragt. -
if($var==(int) $var) {
Riskant. PHP hat eine Menge an implicit type-casts drinne, dass du dich darauf nicht verlassen solltest. Nutzte stattdessen is_numeric().
Der RegExp wäre:
preg_match('/^[A-Za-z0-9-_]+$/', ...);
Für mindestens eines dieser Zeichen. -
nikic schrieb:
if($var==(int) $var) {
Riskant. PHP hat eine Menge an implicit type-casts drinne, dass du dich darauf nicht verlassen solltest.
Aber ich prüfe doch, ob der Ursprungswert mit dem auf int gesetzten Wert über ein stimmt.
nikic schrieb:
Nutzte stattdessen is_numeric().
Das geht nicht. Hexadazimale Zahlen werden weiterhin elraubt sein. Es muss Integrar sein. Also es sind keine Komma-Zahlen, die Zahl ist am kleinesten bei 1 (also immer positiv), und am höchsten bei ca. 2000.
nikic schrieb:
Der RegExp wäre:
preg_match('/^[A-Za-z0-9-_]+$/', ...);
Für mindestens eines dieser Zeichen.
Ist es normal, dass mir nur 1 oder 0 zurück geliefert wird? -
das-koenigreich schrieb:
nikic schrieb:
Der RegExp wäre:
preg_match('/^[A-Za-z0-9-_]+$/', ...);
Für mindestens eines dieser Zeichen.
Ist es normal, dass mir nur 1 oder 0 zurück geliefert wird?
Ja, wenn ein gewünschtes Zeichen gefunden wird gibt die Funktion 1(true) zurück und im anderen Fall 0 (false). Auch nachzulesen hier: http://php.net/manual/de/function.preg-match.php
Beitrag zuletzt geändert: 21.11.2009 12:06:02 von karpfen -
Aber ich prüfe doch, ob der Ursprungswert mit dem auf int gesetzten Wert über ein stimmt.
Oh, da kennst du PHP schlecht :D
Seh dir das an:
if((string) '0XBAD' == (string) '2989')
{
echo "PHP suckz";
}
else
{
echo "PHP rulez";
}
Das gibt "PHP suckz" aus. Auch wenn du so gesehen einen expliziten type-cast machst, dann macht PHP noch einen impliziten in einen Integer. Auf sowas sollte man sich bei PHP nicht verlassen.
Wenn du nur Ints haben willst, dann kannst du mit ctype_digit() prüfen (oder natürlich auch mit RegExp.)
Zu der Sache mit maximal zwei Zahlen: Kannst du mal die genauen Anforderungen schreiben? Also wo darf was stehen. Dann können wir dir einen RegExp zusammenstellen. -
nikic schrieb:
Seh dir das an:
Da mache ich einfachif((string) '0XBAD' === (string) '2989') { echo "PHP suckz"; } else { echo "PHP rulez"; }
draus, und es funktioniert.
nikic schrieb:
Zu der Sache mit maximal zwei Zahlen: Kannst du mal die genauen Anforderungen schreiben? Also wo darf was stehen. Dann können wir dir einen RegExp zusammenstellen.
- ein String
- maximal 10 Zeichen
- davon maximal 2 Zahlen (wenn es einfacher wird, mach 10 Buchstaben, und 2 Zahlen draus, dann sind halt 12 möglich)
- keine anderen Zeichen, außer Buchstaben und Zahlen
- die Zahlen dürfen überall stehen
- der String darf auch nur aus Buchstaben bestehen
- der Sting muss mindestens 3 Zeichen lang sein -
Ja, das === würde gehen. Ich möchte damit nur sagen, dass man sich in PHP auf type-casts nicht verlassen soll, insbesondere, wenn es eine sicherheitsrelevante Frage ist.
Für das was du willst bräuchte man meines Erachtens zwei reguläre Ausdrücke:
/^[A-Za-z0-9]{3,10}$/ /^[^0-9]*[0-9]?[^0-9]*[0-9]?[^0-9]*$/
Obwohl ich beim zweiten auch nicht sicher bin, ob das gehen würde... (warum willst du das überhaupt auf zwei Zahlen beschränken?)
Effektiver würdest du das mit den zwei Zahlen machen, indem du die einzelnen Zeichen durchgehst und checkst ob sie eine Zahl sind. -
Danke für die Codes, ich werde sie gleich testen!
nikic schrieb:
Effektiver würdest du das mit den zwei Zahlen machen, indem du die einzelnen Zeichen durchgehst und checkst ob sie eine Zahl sind.
Das hatte ich ursprünglich vor, aber mir hat jemand geraten, das mit preg_match zu machen, da es schneller ausführbar ist, vorallem, wenn sehr viele auf dem Server sind. -
*push*, damit User Thread weiter führen kann.
Beitrag zuletzt geändert: 6.12.2009 15:32:53 von nikic -
Hi, ich bins nochmal, ich bräuchte noch einen weiteren Code, da ich gemerkt habe, dass der alte nichts bringt. Also er funktioniert schon, nur passt er nicht, ich habe etwas vergessen.
Folgende Zeichen sollen jetzt erlaubt sein, und zwar überall in der Zeichenkette:
- kleine Buchstaben
- große Buchstaben
- Zahlen
- Punkte
- Leerzeichen
Es währe schön, wenn ihr mir noch schnell den Regex geben könntet, falls Fragezeichen und Ausrufezeichen auch erlaubt sein sollen, das überlege ich mir nämlich grade noch.
Beitrag zuletzt geändert: 8.12.2009 17:24:09 von das-koenigreich -
nikic schrieb:
/^[a-zA-Z0-9. ]{min,max}$/
Soll bei "min" und "max" ein Wert hin, oder gehört das so? -
Jops, da soll die Anzahl der minimalen / maximalen Zeichen hin. Wenn du beliebig viele Zeichen (mindestens 1) haben willst, ersetze {min,max} durch +. Wenn du nur eine Mindestanzahl haben willst, dann nutze {min,}
-
Es dürfen beliebig viele Zeichen sein. 0 Zeichen oder 1.000. Das soll egal sein. Gibt das auch 1 zurück, wenn ich einen leeren String sende, und soll ich "+" schreiben oder "{+}"?
-
Aso, wenn auch 0 Zeichen okay sind, dann mach es so:
/^[a-zA-Z0-9. ]*$/
/^[a-zA-Z0-9. !?]*$/
* steht für {0,}, also mindestens 0, maximal unendlich Zeichen. Das wird dir also auch bei einem leeren String ein true geben ;)
Beitrag zuletzt geändert: 8.12.2009 20:14:39 von nikic -
Vielen Dank! Was mich wundert: Das 3. letzte Zeichen war vorher ein +, und du hast ein * draus gemacht. Welchen Unterscheid macht das? Und: könntest du Bindestriche und Unterstriche auch zulassen?
-
+ steht für {1,}
* steht {0,}
Also, es ändert nur, ob du auch leere Strings akzeptierst.
Binde- und Unterstriche fügst du einfach hinten in die Klammer ein:
/^[a-zA-Z0-9. !?-_]*$/
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage