[PHP] Special characters in regular expression

Pagina: 1
Acties:
  • 674 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Tijdens het maken (en leren) van enkele reguliere expressies kwam ik er bij het testen achter dat speciale tekens als é,ë,ò,ä etc. niet worden geaccepteerd. In namen, plaatsen en adressen e.d. komen deze toch geregeld voor.

Ik heb eens gegoogled (en de FAQ bekeken) en het viel me op dat er in de meeste tutorials geen woord over gerept wordt. Voor bijvoorbeeld de controle van een persoonsnaam wordt vaak iets in de trend als hieronder gebruikt.

code:
1
2
3
4
function naam($naam) 
{ 
     return(ereg('^[A-Za-z. -]+$', $naam)); 
}


Mijn vraag is of hier een eenvoudige oplossing voor bestaat. Ik zou natuurlijk alle speciale tekens kunnen zoeken en in een loop de variabel controleren of desnoods alle tekens kunnen omzetten in html en dan nalopen, maar ik heb zo'n vermoeden dat het sneller kan.

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Wat is je vraag precies? Dit werkt toch gewoon:
code:
1
return(ereg('^[A-Za-z. -éëòä]+$', $naam));

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Jan_V
  • Registratie: Maart 2002
  • Nu online
Ik heb zojuist even gezocht op de term regular expression collation en kwam de volgende link tegen
http://unicode.org/reports/tr18/tr18-9.html
Bij het hoofdstuk 2 Extended Unicode Support: Level 2 beginnen ze over 'speciale' karakters. Misschien dat je hier iets kunt vinden.

Een oplossing die ik heb gebruikt bij een gemaakte website is de ë, å, ü, etc. tekens laten replacen door de gewone tekens, dus de e, a, u, etc. en daarop m'n reguliere expressie doen.
Dit was in ASP classic. In de modernere talen zitten waarschijnlijk wel betere oplossingen (misschien ook wel in ASP classic), maar die ken ik niet.

Ik denk niet dat dit een efficiente oplossing is, noch ben ik er trots op, maar het werkt wel redelijk in mijn totale oplossing.

[ Voor 5% gewijzigd door Jan_V op 13-11-2007 19:38 ]

Battle.net - Jandev#2601 / XBOX: VriesDeJ


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
T-Mob > Heel stom maar hier heb ik simpelweg nog nooit aan gedacht. Ik was er vanuit gegaan dat dergelijke tekens niet in de reguliere expressie mochten voorkomen. Ik heb het inmiddels wel geprobeerd maar werken doet het niet echt. Het laat namelijk alles door behalve een leeg veld.

code:
1
2
3
4
5
6
7
8
9
10
11
12
function naam($naam)
{
    if(!ereg('^[A-Za-z. -èçæåäãâáàÝßÜÛÚØÖÕÔÓÒÑÐÏÎÍÌËÊÉÈÇÆÅÄÃÂÁÀéêëìíïðñòóõöøùúûüýþÿ]+$', $naam))
    {
        return false;
    }
    else
    {
        $naam = htmlentities($naam);
        return $naam;
    }
}


Jan_V > Diezelfde oplossing heb ik weleens eerder gebruikt. Gewoon alles omzetten dupliceren, controleren en weer terugzetten indien nodig. Het is een hele omweg dus ik dacht dat het efficienter zou kunnen. Bedankt in ieder geval voor de link!

[ Voor 33% gewijzigd door Verwijderd op 14-11-2007 00:07 ]


Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Verwijderd schreef op dinsdag 13 november 2007 @ 23:25:
Het laat namelijk alles door behalve een leeg veld.
vind je het gek?

SQL:
1
+


edit: oh, nu ik de reactie hieronder zie, bedenk ik me dat ik de gequote regel verkeerd geinterpreteerd heb... je bedoelt natuurlijk dat hij alles doorlaat, maar dat hij dat niet moet doen... dan heeft T-Mob inderdaad gelijk....

[ Voor 34% gewijzigd door P.O. Box op 14-11-2007 13:04 ]


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Verwijderd schreef op dinsdag 13 november 2007 @ 23:25:
T-Mob > Heel stom maar hier heb ik simpelweg nog nooit aan gedacht. Ik was er vanuit gegaan dat dergelijke tekens niet in de reguliere expressie mochten voorkomen.
Dat het niet werkt zoals je verwacht komt door de . (punt) in je character class. Die heeft de speciale betekenis dat ie alles matched. Je huidige regex matched dus inderdaad elke string die niet leeg is. De oplossing is escapen:
PHP:
1
2
3
4
5
6
7
function naam($naam) {
    if (preg_match('/^[A-Za-z\. \-èçæåäãâáàÝßÜÛÚØÖÕÔÓÒÑÐÏÎÍÌËÊÉÈÇÆÅÄÃÂÁÀéêëìíïðñòóõöøùúûüýþÿ]+$/', $naam)) {
        return htmlentities($naam);
    } else {
        return false;
    }
}

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05 09:40

GX

Nee.

je kan ook '\w' gebruiken, wat een word-character voorstelt. Tenzij je niet alle letterkarakters wilt matchen natuurlijk.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
T-Mob > Bedankt voor je moeite! Ik blijf het regex gebeuren moeilijk vinden..

GX > Bedankt voor de tip.

[ Voor 15% gewijzigd door Verwijderd op 14-11-2007 13:16 ]

Pagina: 1