[REGEX] Integer controleren op validiteit
Ik heb een (beginners?) vraag over een REGEX. Ik zit met de volgende situatie, ik zou een integer moeten hebben die uit totaal drie cijfers bestaat. Deze kunnen een 0 of een 1 zijn(binair). Nu heb ik de volgende code en deze werkt half. Ook denk ik dat de REGEX niet erg efficient is op deze manier...
/(000|001|010|011|100|101|110|111)/
Het probleem hiermee is dat een integer als '10101' ook als true gezien word. De integers die daar staan zijn ook echt de enige mogelijkheden.
Mvg,
Nick Smit.
Mmet [0-1] geef je aan dat het 0 tot en met 1 mag zijn.
{3} geeft aan dat het 3 keer voor moet komen
^betekent begin van de string
\z betekent eind van de string.
Wat je hier zegt is: Je hebt het begin van de string, dan 3 keer een 0 of 1 gevolgd door het einde van de string.
Ook is die uitleg wel fijn!
Toevoeging op 18/07/2013 14:23:09:
Hmm.. Loop nu weer tegen een probleem aan. Het blijkt zo te zijn dat integers die beginnen met een 0 niet als decimaal maar als octaal getal worden gezien. Dus 001, 010 en 011 worden geconverteerd naar de volgende getallen: 1, 8 en 9.
Hoe kan ik ervoor zorgen dat deze getallen decimaal blijven? Is dit mogelijk om gewoon uit te zetten?
Nick Smit op 18/07/2013 13:03:22:
...worden geconverteerd naar de volgende getallen: 1, 8 en 9.
Hoe kan ik ervoor zorgen dat deze getallen decimaal blijven?...
Hoe kan ik ervoor zorgen dat deze getallen decimaal blijven?...
Wat betreft het data type:
Php zal het data type pas geven op de plek waar je ze gebruikt. Zo werkt php, met losse types.
ter illustratie
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$a = "123"; // duidelijk een string
$b = 52; // duidelijk een integer
echo $a + $b .'<br>'; // aangezien we met "+" bezig zijn, zal $a hier als integer 123 aanzien worden
echo gettype($a) .'<br>'; // toch blijft $a mooi een string, als je er om vraagt
echo $a . $b .'<br>'; // aangezien we met "." bezig zijn, zal $b hier als string "52" aanzien worden
echo gettype($b) .'<br>'; // toch blijft $b mooi een integer, als je er om vraagt
?>
$a = "123"; // duidelijk een string
$b = 52; // duidelijk een integer
echo $a + $b .'<br>'; // aangezien we met "+" bezig zijn, zal $a hier als integer 123 aanzien worden
echo gettype($a) .'<br>'; // toch blijft $a mooi een string, als je er om vraagt
echo $a . $b .'<br>'; // aangezien we met "." bezig zijn, zal $b hier als string "52" aanzien worden
echo gettype($b) .'<br>'; // toch blijft $b mooi een integer, als je er om vraagt
?>
----
Dus, in welke omstandigheden gebeurt wat je daar beschrijft?
De conclusie die je trekt in je vraag, klopt waarschijnlijk niet.
Gewijzigd op 18/07/2013 15:18:37 door Kris Peeters
De vraag is hoe je die getallen binnen krijgt. Krijg je het uit een database of van de gebruiker via GET, POST, COOKIE, of iets dergelijks, dan is het in feite een string. Die string kan je eerst linkstrimmen op de 0, zodat je een decimale int over houdt. Daarna kan je het gewoon gebruiken zoals je wilt.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
//komt van de browser
$_GET['num'] = '010';
//haal alle nullen links weg
$_GET['num'] = ltrim( $_GET['num'], '0' ); //waarde is nu '10'
?>
//komt van de browser
$_GET['num'] = '010';
//haal alle nullen links weg
$_GET['num'] = ltrim( $_GET['num'], '0' ); //waarde is nu '10'
?>
Dit komt vanuit een configuratie bestand. Hierin word de code neergezet en PHP moet daarna gaan berekenen welke permissies er meegegeven gaan worden. Het is eigenlijk de bedoeling dat 010 gewoon 010 blijft(het liefst als integer vorm, als dit echt niet mogelijk is zal ik er toch een string van moeten maken denk ik).
Waarom zou je het het liefst als integer willen hebben? Omdat je dan makkelijk door 10 kunt delen gok ik? In dat geval kan je net zo goed die string houden en gewoon met een loopje elk karakter uitlezen. Een integer heeft namelijk helemaal geen voorloop nullen, die kan je dus ook niet behouden. De 'integer' 001 bestaat dus in feite niet, dat is 1.
Nick Smit op 18/07/2013 15:54:14:
... als dit echt niet mogelijk is ...
Wel, het probleem is niet eens een php probleem, maar een probleem van definities.
10 is het zelfde getal als 010 en 000000010.
Het is echter een eeuwenoude traditie om leading zeros niet te schrijven.
Maar als jij wil dat 10 er uit ziet als 010 (en je wil dat 010 niet het zelfde is als 10), ben je niet met integers bezig. Dan ben je met strings bezig.
---
Maar wat is het probleem eigenlijk echt?
Waarom wil je die waarde als integer bijhouden? (Ofwel: weerom wil je die voorste 0 bewaren?)
Waarom niet als string of als binair?
Als het ergens echt problemen levert, lossen we die wel op.
Gewijzigd op 18/07/2013 16:31:11 door Kris Peeters
Grapjas, waarom zou je van string naar int en dan weer naar string gaan? Of wou je zeggen dat je het dan weer naar een int wilt laten gaan zodat je weer van voren af aan kunt beginnen?