[PHP/RegExp] Checken of een string verboden tekens bevat*

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

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Depress
  • Registratie: Mei 2005
  • Laatst online: 18-09 22:29
Hallo,
ik wil bekijken of een string de toegestane chars bevat.
ik kwam op dit idee:
PHP:
1
2
3
if(preg_match('[A-Za-z0-9]', $str) == 0){
    $error = True;
}


Maar dit werkt niet. De string mag alleen a-z A-Z en 0-9 bevatten. Wat is der fout?

Acties:
  • 0 Henk 'm!

Verwijderd

<?
if(!preg_match('/[A-Za-z0-9]/', $str)){
$error = True;
}
?>

[ Voor 20% gewijzigd door Verwijderd op 30-01-2006 18:17 ]


Acties:
  • 0 Henk 'm!

  • Wim Leers
  • Registratie: Januari 2004
  • Laatst online: 09-09 08:00
Of:

PHP:
1
2
3
4
<?php
if (!preg_match('[A-Za-z0-9]', $str))
        $error = true;
?>


of:
PHP:
1
2
3
<?php
$error = preg_match('[A-Za-z0-9]', $str) ? false : true;
?>

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Met andere woorden: gewoon in de manual kijken wat het nu eigenlijk is dat een functie returnt en daarop checken, en niet zomaar wat doen. ;)

Maareh, de oplossingen die hier aangedragen worden zijn niet goed. Dit werkt beter:
PHP:
1
2
if (preg_match('/[^a-z0-9]/i', $str))
        $error = true;

De eerste oplossing van Bashrat doet net iets anders: die zet $error op true als er geen A-Z, a-z of 0-9 in voorkomt. Die van mij zet $error op true als er iets anders in de string zit dan de genoemde tekens, en dat is net wat anders. :P

'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!

  • ShadowLord
  • Registratie: Juli 2000
  • Laatst online: 18-09 22:12
Persoonlijk zou ik het volgende doen, maar dit doet (bijna) hetzelfde als de match van NMe. Die van NMe kijkt of er karakters in de string voorkomen die NIET A-Za-z0-9 zijn. Die van mij kijkt of heel de string bestaat uit A-Za-z0-9.

Overigens is er een subtiel verschil. Mijn check laat geen lege strings door, die van NMe wel. Je kan dit gedrag wel wijzigen door van de + een * te maken. Dan zal deze check ook lege strings doorlaten. Ook zal die van mij bij een error in preg_match $error op true flaggen. De code van NMe zal dit niet doen.

PHP:
1
2
if (!preg_match('^[A-Za-z0-9]+$', $str))
        $error = true;


De ^ en $ heb je nodig zodat je niet ergens een karakter midden in de string matched, maar heel de string. De + heb je nodig omdat je anders alleen een string met 1 karakter checked. Een + betekend 1 karater of meer van het voorgaande (en een * betekend 0 of meer van het voorgaande).

edit:
De oplossing van Bashrat is dus fout, want die mist de ^ en $

[ Voor 8% gewijzigd door ShadowLord op 30-01-2006 22:54 ]

You see things; and you say, "Why?" But I dream things that never were; and I say, "Why not?"


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:44

crisp

Devver

Pixelated

Vergeet de delimiters niet ;)

[ Voor 131% gewijzigd door crisp op 30-01-2006 22:59 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Wim Leers
  • Registratie: Januari 2004
  • Laatst online: 09-09 08:00
@-NMe- & ShadowLord: ik heb gewoon Kritz' code overgenomen, maar fatsoenlijk geïndenteerd. That's it. In het vervolg kijk ik wél naar de code |:(
Pagina: 1