[PHP] ereg, kom er niet uit ...

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 16-08 21:48

TheLunatic

Ouwe boxen.

Topicstarter
Okay, ik ben bezig met het valideren van input via een form. Er mag op een bepaald veld alleen maar integer worden ingevoerd. Ik zou dus is_int() kunnen gebruiken, maar omdat het via een form gaat zou ik is_numeral() moeten gebruiken, welke ook true geeft als er een float wordt ingegeven.

In ieder geval, ik wil dus zelf een functie schrijven.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  function IsValidInteger($value)
  {
    if (ereg("(0|-?[1-9])[0-9]*$", $value))
    {
      $result="true";
    }
    else
    {
      $result="false";
    };  
    
    return $result;
    
  };


en ja, ik wil een string terugkrijgen, geen boolean

op --removed want problem solved-- is te zien wat het resultaat hier van is.

Het probleem zit 'em dus in het feit dat ik er absoluut geen letters [a-zA-Z] in wil hebben. Ben al met ^ enzo bezig geweest maar krijg het niet voor elkaar, en ik volg de guide op deze site, omdat nl.php.net te weinig info gaf... Ook GoT search gaf geen antwoorden. En ja, ik heb echt wel gezocht en zelf geprobeerd, maar 't lukt me gewoon niet...

edit ohja, voor het uitsluiten van letters had ik dus [^a-zA-Z] gebruikt, als in "(0|-?[1-9])[^a-zA-Z][0-9]*$" .

[ Voor 16% gewijzigd door TheLunatic op 05-04-2004 16:54 ]

Mother, will they like this song?


Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Misschien niet geheel het antwoord wat je wil hebben, maar waarom doe je niet eerst een is_numeric gevolgt op een check voor de decimale punt?

Acties:
  • 0 Henk 'm!

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 16-08 21:48

TheLunatic

Ouwe boxen.

Topicstarter
Osiris schreef op 05 april 2004 @ 15:45:
Misschien niet geheel het antwoord wat je wil hebben, maar waarom doe je niet eerst een is_numeric gevolgt op een check voor de decimale punt?
Is inderdaad een mogelijkheid, maar het gaat mij in dit geval vooral om het onder de knie krijgen van ereg, en dat ik het principieel op deze manier wil doen...

Mother, will they like this song?


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 16:28
Je website redirect naar localhost... :?

Maar het is het handigst om alleen toe te staan wat je wel wilt (in plaats van te verbieden wat je niet wilt, wat erg lastig is). Als je een optioneel plus/min-teken gevolgd door een reeks van tenminste 1 cijfer wilt toestaan, en dat is alles wat er in de string mag voorkomen, dan wordt het patroon zoiets: ^[+-]?[0-9]+$.

Met ^ en $ match je het begin en het einde van de string, wat betekent dat de string in het geheel aan je patroon moet voldoen (zodat 'foo 123 bar' geen geldige invoer is). [+-]? matcht een optioneel teken en [0-9]+ matcht een niet-lege reeks van cijfers.

Op deze manier worden ook notaties als +0001 toegestaan, maar ik zou niet weten waarom dat een probleem is. (Die notatie wordt ook gewoon door PHP ondersteund en je kunt er dus gewoon mee verderreken alsof het het getal 1 was).

[ Voor 41% gewijzigd door Soultaker op 05-04-2004 15:51 ]


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Als je het perse met een reg wilt doen:
PHP:
1
2
3
4
5
6
7
8
<?php

function isValidInt($value)
{
    return ( ( is_int($value ) || preg_match("/^[+-]?\d+$/", $value) ) ? "true" : "false" );
}

?>

Het is wel een stuk trager. Je moet eigenlijk proberen regexps zo veel mogelijk te mijden.
edit:

ff de functie verbeterd: van [0-9] \d gemaakt, en die [+-] erbij gezet (nog niet aan gedacht)

[ Voor 24% gewijzigd door Michali op 05-04-2004 15:53 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 16-08 21:48

TheLunatic

Ouwe boxen.

Topicstarter
Soultaker schreef op 05 april 2004 @ 15:49:
Je website redirect naar localhost... :?

Maar het is het handigst om alleen toe te staan wat je wel wilt (in plaats van te verbieden wat je niet wilt, wat erg lastig is). Als je een optioneel plus/min-teken gevolgd door een reeks van tenminste 1 cijfer wilt toestaan, en dat is alles wat er in de string mag voorkomen, dan wordt het patroon zoiets: ^[+-]?[0-9]+$.

Met ^ en $ match je het begin en het einde van de string, wat betekent dat de string in het geheel aan je patroon moet voldoen (zodat 'foo 123 bar' geen geldige invoer is). [+-]? matcht een optioneel teken en [0-9]+ matcht een niet-lege reeks van cijfers.

Op deze manier worden ook notaties als +0001 toegestaan, maar ik zou niet weten waarom dat een probleem is. (Die notatie wordt ook gewoon door PHP ondersteund en je kunt er dus gewoon mee verderreken alsof het het getal 1 was).
Deze is inderdaad de oplossing ! Maar met ^ kun je toch ook aangeven dat je een bepaald karakter niet in je string wilt ?

Mother, will they like this song?


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 16:28
Mja, ^ heeft een andere betekenis binnen een bracket expression (zoals [+-] in dit voorbeeld) dan daarbuiten. Als eerste karakter in bracket expression betekent het inderdaad 'match NIET de volgende karakters' maar buiten een bracket expression matcht het gewoon het begin van een string.
Pagina: 1