nummer validatie hulp
ik ben bezig aan een bepaald script, en ik wilde graag weten of iemand weer hoe je het voor elkaar krijgt om van een string met nummers de voorste nummer de valideren en te redirecten naar een bepaalde page. ik zal even een voorbeeld geven:
er zijn 2 nummers die toewijzen naar een 2 pages. nummer 1 forward naar page1 en nummer 2 naar page2, ik wil dus als iemand in een input zet: 12398235927392 mijn form weet dat het naar page1 moet en ook alleen het begin nummer valideerd en niet heel de string gaat controleren op nummer 1 of te redirecten hopelijk is het een beetje duidelijk wat ik wil. gewoon alles wat begin met 1 gaat naar p1 en alles wat begint met 2 naar p2.
alvast bedankt. :)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
//Voorbeeld:
$string = "12398235927392";
//Pak het eerste teken... Dus een 1.
$firstCharacter = $string[0];
// Toon het eerste teken.
echo $firstCharacter;
?>
//Voorbeeld:
$string = "12398235927392";
//Pak het eerste teken... Dus een 1.
$firstCharacter = $string[0];
// Toon het eerste teken.
echo $firstCharacter;
?>
In de controle van @Ariën hierboven zou ik ook nog even controleren of de invoer ($string) niet leeg is, anders is $string[0] ongedefinieerd.
- Ariën - op 18/08/2019 00:13:39:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
//Voorbeeld:
$string = "12398235927392";
//Pak het eerste teken... Dus een 1.
$firstCharacter = $string[0];
// Toon het eerste teken.
echo $firstCharacter;
?>
//Voorbeeld:
$string = "12398235927392";
//Pak het eerste teken... Dus een 1.
$firstCharacter = $string[0];
// Toon het eerste teken.
echo $firstCharacter;
?>
deze snap ik niet: $string[0]; wrm 0 en niet 1 want het moet kijken of het begin wel een 1 of een 2 is en beide worden doorwezen naar een andere pagina dus is niet helemaal helder :$
Toevoeging op 18/08/2019 03:54:58:
Thomas van den Heuvel op 18/08/2019 02:25:14:
Op het moment dat je dingen gaat valideren is het ook zaak dat je in termen van uitzonderingen gaat denken. Wat als de invoer niet van het goede formaat is? Wat doe je dan?
In de controle van @Ariën hierboven zou ik ook nog even controleren of de invoer ($string) niet leeg is, anders is $string[0] ongedefinieerd.
In de controle van @Ariën hierboven zou ik ook nog even controleren of de invoer ($string) niet leeg is, anders is $string[0] ongedefinieerd.
kun je ietsjes specifieker zijn :$
Lees ook het commentaar in de code.
Test maar eens uit ;-)
En wat als de waarde dan niet ingevuld is? Dan moet je dus met isset() controleren. Eventueel met is_numeric() of het een getal is. En dan kan je de gebruiker laten doorsturen.
Gewijzigd op 18/08/2019 07:21:42 door - Ariën -
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$string = "12398235927392";
if(preg_match('/^(\\d)/',$string,$match)){ //string begint met een cijfer
$firstCharacter = $match[1];
echo $firstCharacter; //doe iets met cijfer
}
?>
$string = "12398235927392";
if(preg_match('/^(\\d)/',$string,$match)){ //string begint met een cijfer
$firstCharacter = $match[1];
echo $firstCharacter; //doe iets met cijfer
}
?>
Als er meer voorwaarden aan een nummer zitten, zoals bijv: Derde getal moet 5 zijn en tiende en elfde getal 65 en een totaallengte van 14. Dan is een reg-ex mogelijk wel het beste.
Als dit onderdeel is van een formuliervalidatie maakt het echt niet uit dat je een of meer regexps gebruikt, als je deze constructie tientallen tot honderden keren in een pagina-aanroep stopt wordt het natuurlijk een ander verhaal.
Dat iets "duur" is is niet op voorhand slecht. En soms heb je deze "dure" constructies gewoon nodig. Het enige wat je dan kunt doen is er spaarzaam mee omgaan. Zoals het uitvoeren van queries. Deze zijn relatief gezien ook redelijk topzwaar, dus als je kunt besparen op het aantal uitgevoerde queries in een page-access dan zou je daar naar moeten streven. Tenzij dit je applicatie weer nodeloos complex maakt. Dan valt er misschien toch iets te zeggen dat je dingen bewust splitst. Het is altijd een tradeoff...
Maar in de praktijk maakt het niks uit, maar ik geef het liefst de snellere oplossingen aan. Mocht iemand er ooit plannen mee hebben om dit in een loop te gooien, dan weet diegene meteen hoe de performance kan zijn.
- Ariën - op 18/08/2019 14:46:41:
De beste oplossing is om te kijken wat sneller is, door iets 2.000 keer uit te voeren, en per functie te bekijken hoelang die erover doet. Toch eens straks uittesten! Ben benieuwd.....
Maar dat is het em dus juist. Daarmee bewijs je alleen het gegeven dat een regexp wat trager is. Maar daarmee ga je dus voorbij aan de manier waarop het wordt gebruikt...
<snelle methode> 10000x uitvoeren
vs
<langzamere methode> 10000x uitvoeren
Daar hoef je geen test voor te draaien om de uitkomst te weten.
Anyway, het is altijd leuk om te zien hoeveel wegen er naar Rome leiden. De ene is weer net wat langer dan de andere ;-)
- Ariën - op 18/08/2019 17:23:35:
Anyway, het is altijd leuk om te zien hoeveel wegen er naar Rome leiden. De ene is weer net wat langer dan de andere ;-)
Mja, maar jouw weg komt niet eens aan in Rome maar eindigt halverwege mogelijk in het moeras. In jouw code peuter je simpelweg het eerste karakter eraf zonder te controleren of de string inhoud bevat, maar er wordt nog steeds niks gecontroleerd. Dit is dus
Los van de kosten van operaties zou je ook moeten kijken naar de lengte van code (en je zou ook gewoon moeten blijven analyseren wat je aan het doen bent...) want dat is in zekere zin ook "complexiteit" voor de programmeur. Dit kost ook (ontwikkel)tijd om de draad weer op te pakken als hier wijzigingen in aangebracht moeten worden. Er spelen meerdere afwegingen dan enkel performance.
Als je puur eendimensionaal redeneert en verder alles behalve performance buiten beschouwing laat heb je gelijk. Maar zo moet je geen code schrijven natuurlijk.
In zekere zin is de opzet van @Rob een goede aanzet maar nog steeds niet helemaal in overeenstemming met de spec. Om alles in 1x plat te slaan:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$input = '32345'; // alleen geldig als dit begint met '1' of '2'
if (preg_match('#^([12])#', $input, $match) == 1) {
// redirect naar $match[1]
} else {
// foutafhandeling voor als de invoer niet geldig is
}
?>
$input = '32345'; // alleen geldig als dit begint met '1' of '2'
if (preg_match('#^([12])#', $input, $match) == 1) {
// redirect naar $match[1]
} else {
// foutafhandeling voor als de invoer niet geldig is
}
?>
Natuurlijk roept dit ook vragen op. Die pagina's '1' en '2' neigen sterk naar "magische constanten" dus de vraag is sowieso of met deze aanpak in beginsel wel de goede weg ingeslagen is...
Uiteraard moet je controleren of het bestaat, en of het een getal is, en daar zijn isset() en is_numeric() prima functies voor, maar dat zie ik als een volgende stap die ik in alle vroegte vandaag al getypt heb :-)
Ik hoop trouwens dat we het niet te complex voor de topicstarter maken. In simpele lijnen kan het als volgt. Uiteindelijk ben ik ook wel benieuwd naar de beweegredenen van de topicstarter waarom hij naar de eerste tekens wilt kijken.
Code (php)
Gewijzigd op 18/08/2019 19:57:25 door - Ariën -
- Ariën - op 18/08/2019 19:28:23:
$firstCharacter = $string[0];
if (isset($firstCharacter)
if (isset($firstCharacter)
En zelfs met deze simpele code ga je de mist in. isset() geeft ten onrechte true terug, ook al is de string leeg...
Fixed and tested.
mb_substr() met een switch … case …
Of oke iedereen ik ga het straks allemaal testen ik ga jullie laten weten wat goed werkte :) alvast bedankt voor alle reacties