[REGEX] Integer controleren op validiteit

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Nick Smit

Nick Smit

18/07/2013 12:06:18
Quote Anchor link
Hallo,

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.
 
PHP hulp

PHP hulp

24/04/2024 09:54:07
 
TJVB tvb

TJVB tvb

18/07/2013 12:32:13
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$input
= '101';
if( preg_match('/^[0-1]{3}\z/', $input) ){
    echo 'Valid';
}
?>


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.
 
Nick Smit

Nick Smit

18/07/2013 13:03:22
Quote Anchor link
Danku zeer.

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?
 
Kris Peeters

Kris Peeters

18/07/2013 15:15:25
Quote Anchor link
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?...


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)
PHP script in nieuw venster Selecteer het PHP script
1
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
?>


----

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
 
Erwin H

Erwin H

18/07/2013 15:23:11
Quote Anchor link
Getallen die beginnen met een 0 worden gezien als octaal getal inderdaad (0x als hexadecimaal, 0b als binair). Als je dus een string die begint met een 0 typecast naar een int (expliciet, of impliciet) dan krijg je een octaal getal.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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'
?>
 
Nick Smit

Nick Smit

18/07/2013 15:54:14
Quote Anchor link
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).
 
Erwin H

Erwin H

18/07/2013 16:21:38
Quote Anchor link
Dan krijg je het dus binnen als een string (een bestand geeft altijd een string) en je hoeft er dus helemaal geen string van te maken, dat is het al.
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.
 
Kris Peeters

Kris Peeters

18/07/2013 16:23:36
Quote Anchor link
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
 
Eddy E

Eddy E

18/07/2013 17:41:42
Quote Anchor link
Met str_pad() kan je eventueel weer nullen voor je integer gooien

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$getal
= "01010";
$int = intval($getal); // 1010;
$string = str_pad($int, 6, '0', STR_PAD_LEFT); // 000001010
?>
 
Erwin H

Erwin H

18/07/2013 17:52:40
Quote Anchor link
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?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.