Avatar billede AnyFellow Mester
12. februar 2012 - 16:55 Der er 19 kommentarer og
1 løsning

Hjælp til eregi

Hej

Jeg har denne der kontrollerer at et tal ikke indeholder andet end tal med 2 decimaler.

!eregi('^[0-9]+,[0-9]{0,2}$', $value)

Mit problem er dog at den kræver at der er 2 decimaler.

Er der en venlig sjæl der vil rette den til således:
- at den også accepterer tal uden decimaler
- at den også accepterer tal med en enkelt decimal
- at den ikke accepterer tal der starter med 0
Avatar billede DeeDawg Nybegynder
12. februar 2012 - 17:31 #1
Først og fremmest bør du ikke benytte funktionen eregi(), da den er forældet.

Men her har du dit pattern

<?php
    if(!preg_match("#^([1-9]{1})([0-9]+)(,?[0-9]){0,2}$#", $value)){ die("Invalid input!"); }
?>
Avatar billede olebole Juniormester
12. februar 2012 - 17:34 #2
<ole>

Du kan ikke bruge RegExp på tal. RegExp er til mønstersøgning i strenge

/mvh
</bole>
Avatar billede DeeDawg Nybegynder
12. februar 2012 - 17:37 #3
Korrekt olebole, men siden han søger efter et , så er det vist heller ikke rigtige tal han benytter. :)
Avatar billede olebole Juniormester
12. februar 2012 - 18:47 #4
I så fald kan udtrykket skæres ned til "#^[1-9][0-9]+,?[0-9]{0,2}$#".

Hvis 'tallet' skal indeholde 2 decimaler, bør der derimod nok stå "#^[1-9][0-9]+,[0-9]{2}$#"
Avatar billede DeeDawg Nybegynder
12. februar 2012 - 18:58 #5
Ah, ja. Selvfølgelig. Min start på det pattern er da vist lidt overkill og unødvendigt. xD

Personligt, har jeg det bedst med at holde tingene i paranteser, så jeg ved hvad der hører til hvad, men det er jo smag og behag. :)
Avatar billede olebole Juniormester
12. februar 2012 - 19:11 #6
I det viste mønster, tror jeg ikke, det betyder en kvart malmbjælde, men en parentes opretter og gemmer et subpattern. Ved større og komplekse RegExp's kan de sløve en del - og bør defor nok kun benyttes, når man reelt har brug for dem  =)
Avatar billede AnyFellow Mester
12. februar 2012 - 19:15 #7
Jeg har nu prøver følgende:

<?php
$array[] = "1";
$array[] = "10";
$array[] = "10,0";
$array[] = "10,1";
$array[] = "10,12";
$array[] = "10,123";
$array[] = "01";
$array[] = "01,12";
$array[] = "123";
$array[] = "0123";

foreach ($array as $key => $value) {
    if (!preg_match("#^[1-9][0-9]+,?[0-9]{0,2}$#", $value)) {
        echo $value." er ikke gyldigt.<br>";
    } else {
        echo $value." er gyldigt.<br>";
    }
}
?>


Jeg får følgende output:
[div][pre]
Avatar billede AnyFellow Mester
12. februar 2012 - 19:16 #8
Flot, fik trykket inden jeg blev færdig.

Jeg får følgende output:
[/pre]
1 er ikke gyldigt.
10 er gyldigt.
10,0 er gyldigt.
10,1 er gyldigt.
10,12 er gyldigt.
10,123 er ikke gyldigt.
01 er ikke gyldigt.
01,12 er ikke gyldigt.
123 er gyldigt.
0123 er ikke gyldigt.
[/pre]


Alt er som ønsket, med undtagelse af tal bestående af ét ciffer. Den betragtes også som ugyldig.
Avatar billede olebole Juniormester
12. februar 2012 - 19:33 #9
Hvad skal mønstret acceptere, og hvad skal forkastes?

Skal der være et komma og to decimaler? Skal et tal med et komma og én decimal accepteres? Skal et tal uden decimaler accepteres?
Avatar billede AnyFellow Mester
12. februar 2012 - 19:38 #10
Følgende skal accepteres:
- Positive tal uden decimaler
- Positive tal med 1 decimal (',' som seperator)
- Positive tal med 2 decimaler (',' som seperator)

Indhold med alle former for bogstaver og tegn (med undtagelse af komma) skal afvises.
Tal der starter med '0' skal afvises.
Negative tal skal afvises.
Avatar billede olebole Juniormester
12. februar 2012 - 20:05 #11
Prøv med:

"#^[1-9][0-9]*?(,[0-9]{1,2})?$#"
Avatar billede inteeeL Nybegynder
13. februar 2012 - 00:48 #12
Som OleBole nævner, så bruges RegExp til mønstersøgning i en string. I dette tilfælde vil jeg anbefale, at man udarbejder en simpel funktion, som validerer tallet for dig. Funktionen skal returnere true/false - alt efter om tallet opfylder dine krav. Jeg har lavet et eksempel, som meget gerne skulle klare det for dig.

<?php

function CheckNumber( $number) {
    $result = '';
    $number = str_replace(',', '.', $number);
    if( is_numeric( $number) && ( $number > 0)) {
        $splitNumber = str_split( $number);
        if( $splitNumber[0] != '0') {
            if( strpos( $number, '.') !== false) {
                $explode_number = explode('.', $number);
                $digits = $explode_number[1];
                $splitDigits = str_split( $digits);
                if( sizeof( $splitDigits) <= 2) {
                    return true;
                }
                else {
                    return false;
                }
            }
            else {
                return true;
            }
        }
        else {
            return false;
        }
    }
    else {
        return false;
    }
}

$array[] = "1";
$array[] = "10";
$array[] = "10,0";
$array[] = "10,1";
$array[] = "10,12";
$array[] = "10,123";
$array[] = "01";
$array[] = "01,12";
$array[] = "123";
$array[] = "0123";

foreach ($array as $value) {
    if (!CheckNumber($value)) {
        echo $value." er ikke gyldigt.<br>";
    } else {
        echo $value." er gyldigt.<br>";
    }
}

?>


Ovenstående returnerer følgende output:

1 er gyldigt.
10 er gyldigt.
10,0 er gyldigt.
10,1 er gyldigt.
10,12 er gyldigt.
10,123 er ikke gyldigt.
01 er ikke gyldigt.
01,12 er ikke gyldigt.
123 er gyldigt.
0123 er ikke gyldigt.


Funktionen kan muligvis effektiveres, og flere krav kan medtages. Dette må du rode lidt med. :-)
Avatar billede olebole Juniormester
13. februar 2012 - 02:23 #13
"I dette tilfælde vil jeg anbefale, at man udarbejder en simpel funktion" >> Og det anbefaler du udfra hvilke overvejelser?

At den indeholder et ocean af funktionskald og en myriade af betingelser? At den vil se bedre ud som en tatovering på ryggen? Eller noget helt tredie?
Avatar billede AnyFellow Mester
13. februar 2012 - 08:04 #14
olebole...> Perfekt, det var lige hvad jeg var på udkig efter.

Læg et svar og der er point på vej. :)
Avatar billede inteeeL Nybegynder
13. februar 2012 - 11:23 #15
#13. Ingen grund til sarkasme. Jeg anbefalede en funktion, da jeg er af den overbevisning, at når man skal validere tal som disse, er funktioner mere overskuelige/mere anvendelige. Det er nemmere at tilføje flere krav, hvis personen ønsker dette. Et ocean af funktionskald? Tjo, det er vel hvad man gør det til. Begge måder opfylder personens krav.

Det skader ikke at lade spørgeren stifte bekendtskab til begge metoder. Det vil forhåbentligt kun have den positive effekt, at det udvider spørgerens horisont.
Avatar billede olebole Juniormester
13. februar 2012 - 11:43 #16
Jo, al grund til sarkasme. Hvis du har et godt forslag, så begrund det dog i stedet for at holde begrundelsen for dig selv.

"når man skal validere tal som disse, er funktioner mere overskuelige/mere anvendelige" >> Ikke, hvis man har lært (sig) at bruge RegExp.

"Det er nemmere at tilføje flere krav, hvis personen ønsker dette" >> Vi er rigtig mange, der synes det stik modsatte - men det hænger nok igen sammen med, hvad man kan.

"Begge måder opfylder personens krav." >> Ja, men hvorfor må spørgeren ikke træffe et informeret valg?

Hvis jeg ønsker at bestille en saftig oksebøf, og tjeneren i stedet anbefaler mig stegt lever, argumenterer han naturligvis for, hvorfor han anbefaler et alternativ. Det er da helt almindelig logik  =)
Avatar billede inteeeL Nybegynder
13. februar 2012 - 12:24 #17
Jeg beklager; jeg vidste ikke vi sad på skolebænken, hvor argumentationer er alfa omega for, hvad spørgeren vælger.

Det var bestemt ikke min intention ved deltagelsen i denne tråd at signalere, at RegExp ikke er nogen relevant løsning - selvom det godt kan fremstå sådan. "I dette tilfælde vil jeg anbefale, at man udarbejder en simpel funktion, som validerer tallet for dig" vil jeg nok have omformuleret til "En anden måde at gøre det på..." Jeg er personligt ikke fan af, at RegExp bruges i tilfælder som disse. Her er argumentationen anvendelighed og overskuelighed, som lige så godt kan være en smagssag.

Ikke, hvis man har lært (sig) at bruge RegExp. --- [..]men det hænger nok igen sammen med, hvad man kan.. > Jeg ved ikke, hvad tanken bag nedgørelsen af mine kompetencer skyldes. At jeg vælger at opstille en anden metode indikerer nødvendigvis ikke, at jeg ikke er bekendt med RegExp.

Ja, men hvorfor må spørgeren ikke træffe et informeret valg? > Har jeg givet udtryk for det? Spørgeren har fuld ret til at træffe sit eget valg - at spørgeren har flere valg at vælge mellem er vel blot en bonus.
Avatar billede olebole Juniormester
14. februar 2012 - 13:21 #18
Hele meningen med Eksperten er, at man kan lære noget.

Om det er en saglig begrundelse eller blot, om man 'er fan' af den ene eller anden løsning er en overordentlig vigtig information, som bør følge en anbefaling.

Jeg nedgør ikke dine kompetencer, og skriver ikke, at du 'ikke er bekendt med RegExp', men du skriver jo selv, at du ikke finder en RegExp særlig overskuelig. Det taler jo for, du ikke er særlig stærk i RegExp.

Uden informationer om to løsninger er det pr. definition umuligt, at foretage et informeret valg mellem dem.
Avatar billede AnyFellow Mester
16. februar 2012 - 20:44 #19
olebole...> Går ud fra at dit manglende svar som sædvanlig betyder at du ikke vil have point, ellers må du sige til.

Lukker
Avatar billede olebole Juniormester
16. februar 2012 - 21:41 #20
Du har fuldstændig ret, men tak for tilbudet  =)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester