login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Reguliere Expressie probleem

Offline pimpslap - 29/06/2005 05:40 (laatste wijziging 29/06/2005 05:42)
Avatar van pimpslapNieuw lid Ik probeer een opgegeven variabele te filteren tegen mysql injections.
Enige toegestane characters mogen zijn:
Letters (hoofd- en kleine letters)
Cijfers
Puntjes
Slechts één minusteken

Dat laatste blijkt helaas niet mee te vallen.
Ik heb dit geprobeerd:
  1. <?php if(ereg("^[a-zA-Z0-9\.-]+$",$username) && ereg("[-]?",$username))
  2. {
  3. $error_username_illegal = "false";
  4. }
  5. else
  6. {
  7. $error_username_illegal = "true";
  8. } ?>

De script checkt dus of er alleen letters, cijfers, puntjes en minustekens (ja inderdaad, ook meerdere minustekens). En de 2de ereg(); checkt of er slechts 1 minusteken aanwezig is. Dit werkte dus niet.
Weet iemand hoe ik met ereg slechts één minusteken kan toelaten, maar tegelijk wel meerdere kleine/grote letters en puntjes en cijfers kan toelaten en dat allemaal (inclusief minusteken) in willekeurige volgorde.

PS: Het hoeft niet alleen in ereg, andere functies/methode's zijn ook acceptable.

bij voorbaat dank,
-Pimpslap

5 antwoorden

Gesponsorde links
Offline Thomas - 29/06/2005 08:04 (laatste wijziging 29/06/2005 08:05)
Avatar van Thomas Moderator Het probleem is, dat je niet weet waar in je expressie die "-" kan staan - hij kan aan het begin van je nick staan (of mag dit niet ?), hij kan in het midden van je nick staan en hij kan aan het einde van je nick staan.
Je regexp zal er dus ongeveer als volgt uitzien:
"/^[a-z0-9]*[-]?[a-z0-9]*$/i"
(/i zorgt ervoor dat je expressie case-insensitive wordt gematched).

Bovenstaande regexp garandeert echter niet dat je nickname een niet-lege string is, dus je zult ook moeten controleren of de stringlengte tenminste zo lang is als de minimale lengte die je voor een nickname wilt gebruiken.
Offline Legolas - 29/06/2005 08:04
Avatar van Legolas Onbekend Waarom zet je eigenlijk het minteken tussen [ en ], als het toch maar 1 teken is?
Offline pimpslap - 29/06/2005 13:09 (laatste wijziging 29/06/2005 14:41)
Avatar van pimpslap Nieuw lid Haha, geniaal FangorN, waarom kwam ik daar niet op .
En die string length zekerheid fix ik wel. Bedankt voor je hulp.
Wat ik wel niet snap is waarom je een slash voor de ^ hebt gezet.
@Legolas, dat vraag ik me eerlijk gezegd ook af.

Edit:
De juiste code was: "^[a-zA-Z0-9]*[-]?[a-zA-Z0-9]*$"
Ik had niet verwacht dat dit ging werken, althans, het streepje aan het begin van de zin. In de ereg staat het streepje toch duidelijk NA de eerste reeks "[a-zA-Z0-9]*". Dus zoals ik het begrijp, moet je eerst letters/cijfers intikken en vervolgens een streepje, en tot slot nog een reeks cijfer/letters. Maar dit is niet het geval zo te zien, (gelukkig maar) maar hoe krijg je dan wel het geval dat je echt moet doen wat ik net zei: cijfer/letter...streepje...cijfer/letter? Dit wil ik graag weten puur om educatieve doeleinde heb er geen probleem mee ofzo.
Offline Thomas - 29/06/2005 18:48
Avatar van Thomas Moderator Nee, dat zie je verkeerd - een nickname kan met die regexp best met een streepje beginnen, * wil namelijk zeggen "0 of meer karakters".

Toegestane nicknames bij de expressie "^[a-zA-Z0-9]*[-]?[a-zA-Z0-9]*$" zijn bijvoorbeeld:
"" (de lege string)
"Jan-"
"Pi-et"
"-Klaas"
"Kees"

et cetera.

Die slashes voor en na het patroon komen van de functie preg_match, die ik meestal gebruik (en doorgaans -staat op php.net geloof ik- ook iets sneller is). Bij preg_match kun je ook gebruik maken van speciale "modfiers", zoals die "i", zodat je case-insensitive kunt matchen.
Offline pimpslap - 29/06/2005 19:56
Avatar van pimpslap Nieuw lid
Citaat:
* wil namelijk zeggen "0 of meer karakters"

Na het lezen van dat wist ik het al meteen weer was het even vergeten. Ik snap het nu precies, ik wist wel dat je met die regexp een nickname met - kan laten beginnen, maar ik wist niet WAAROM, maar goed, nu dus wel . Nogmaals bedankt voor je hulp.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.185s