[PHP] vreemde tekens in regular expressions

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • MadMan81
  • Registratie: April 2000
  • Laatst online: 21-09 08:49
Voor het valideren van een username gebruik ik een regular expression (en de functie eregi)

code:
1
^[a-zA-Z0-9_/$ -]+$

Het doel: Alleen 'a-z', 'A-Z', '0-9', '_', '/', '$', ' ' en '-'. En dat vanaf het begin van de string tot aan het einde. Deze werkt goed.

Nu kwam echter ook de vraag of een 'â' mocht. Dus heb ik de expressie naar het volgende aangepast:
code:
1
^[a-zA-Z0-9_/$ -\u002e]+$

Deze werkt echter niet. Tenminste niet als er een 'â' in de string zit, anders wel.

Haal ik echter de '+$' van de expressie af, dan werkt het ineens wel. Maar dan is het toch mogelijk om aan het einde van de string nog andere dingen te hebben staan?

Ik heb al gekeken bij www.regular-expressions.info en bij http://furtivecode.com/regexTester.jsp maar het lijkt gewoon te kloppen. Ook google en de faq hier over regular expressions bieden geen uitkomst.

Wat zie ik over het hoofd?

Cupra Born


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

MadMan81 schreef op maandag 09 mei 2005 @ 23:08:
Haal ik echter de '+$' van de expressie af, dan werkt het ineens wel. Maar dan is het toch mogelijk om aan het einde van de string nog andere dingen te hebben staan?
Logisch dat het dan werkt, je matcht dan alleen het eerste karakter van de zin. ;) Zet maar eens een ë neer als eerste karakter, dat gaat ook niet goed. :)

Edit: uit de documentatie van de PCRE-functies op PHP.net:
A "word" character is any letter or digit or the underscore character, that is, any character which can be part of a Perl "word". The definition of letters and digits is controlled by PCRE's character tables, and may vary if locale-specific matching is taking place (see "Locale support" above). For example, in the "fr" (French) locale, some char- acter codes greater than 128 are used for accented letters, and these are matched by \w.
Je moet dus zoeken op karakters die matchen met \w, lijkt me. :)

[ Voor 41% gewijzigd door NMe op 09-05-2005 23:27 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
't Is PCRE onder water. Dat betekent concreet dat je U+002E inderdaad \u002e zou moeten zijn. Alleen, is je â wel een â? Dat zal code-page afhankelijk zijn, als je input ooit 8 bits is geweest.
En als we toch unicode gaan doen \p{L} is het nette equivalent van \w

[ Voor 19% gewijzigd door MSalters op 09-05-2005 23:37 ]

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • MadMan81
  • Registratie: April 2000
  • Laatst online: 21-09 08:49
Dat zou ik dan wel eens kunnen proberen.

Maar dan snap ik nog niet waarom de regexp niet werkt, hij is toch correct of niet ?

@MSalters: is er een manier om dat te controleren? De username komt mee via de $_POST en wordt dan gelijk in eregi gebruikt. Een var_dump laat ook niets bijzonders zien.

[ Voor 41% gewijzigd door MadMan81 op 09-05-2005 23:42 ]

Cupra Born


Acties:
  • 0 Henk 'm!

Verwijderd

MadMan81 schreef op maandag 09 mei 2005 @ 23:08:
[...]

Nu kwam echter ook de vraag of een 'â' mocht. Dus heb ik de expressie naar het volgende aangepast:
code:
1
^[a-zA-Z0-9_/$ -\u002e]+$

Deze werkt echter niet. Tenminste niet als er een 'â' in de string zit, anders wel.

Haal ik echter de '+$' van de expressie af, dan werkt het ineens wel. Maar dan is het toch mogelijk om aan het einde van de string nog andere dingen te hebben staan?

[...]

Wat zie ik over het hoofd?
Moet je niet een aantal tekens escapen in die expressie?

code:
1
^[a-zA-Z0-9_\/$\s\-\u002e]+$

Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
MadMan81 schreef op maandag 09 mei 2005 @ 23:35:
Dat zou ik dan wel eens kunnen proberen.

Maar dan snap ik nog niet waarom de regexp niet werkt, hij is toch correct of niet ?

@MSalters: is er een manier om dat te controleren? De username komt mee via de $_POST en wordt dan gelijk in eregi gebruikt. Een var_dump laat ook niets bijzonders zien.
Mijn veronderstelling is dat de regexp wel werkt, dat je een â wel degelijk matcht, maar dat je $_POST niet in Unicode is cq wel in UTTF-8 is maar verkeerd wordt geconverteerd. Een â is in UTF-8 een andere octet-string dan in ISO8859-1

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1