Jump to content

Need test specific format 1,2,3


meltingpoint

Recommended Posts

Greetings regex experts.  I have an input form that assigns levels to each user.  There are 7 total.  I need to test the input so that it is loaded properly.

 

The edit box entry should look like :  1,2,3,4,5,6,7

- it needs to be separated by commas and need to end with no comma.

- it can be 1,2,3  or  1,4,7  or all of them or only one or two

- the important thing is that it be 1-7, each separated by commas and end with no comma.

 

Any help would be appreciated.

Tks

Link to comment
https://forums.phpfreaks.com/topic/241752-need-test-specific-format-123/
Share on other sites

~^[1-7](,[1-7])*$~

 

This will do it, but if you want to be sure, you're best off using something like the following. It will make sure each value is only used once

 

<?php

$input = '1,2,3,,7,7,7,7,8,9,10';

$vals = array_unique(explode(',', $input));

foreach($vals as $key => $val) {
if($val < 1 || $val > 7 || (int)$val != $val) {
	unset($vals[$key]);
}
}
$output = implode(',', $vals);
echo $output;

Ok-

 

entering a permission level of 1 - does not work

entering a permission level of 1,2 or 1,2,3 or 1,2,3,4  works fine

entering a permission level of 1,2,3,4,5  does not work nor does 1,2,3,4,5,6 or 1,2,3,4,5,6,7

entering a permission level of 2,3,4,5  works but 2,3,4,5,6 does not

 

So to recap- a person will have at least 1 permission level 1-7.  And can have any combination of all 7 permission levels i.e. 1,3,5,7 or 2,4,5 etc.....

I have a suspicion that you are really trying to do this the wrong way. Are you storing the value of "1,2,3" as a value into the database? Besides, if there are 7 possible values, just include 7 checkboxes for input (named as an array). That would make a much more elegant solution. Then just implode the POST values

 

Form:

Level 1 <input type="checkbox" name="levels[]" value="1' />
Level 2 <input type="checkbox" name="levels[]" value="2' />
Level 3 <input type="checkbox" name="levels[]" value="3' />
...etc.

 

PHP

$levels = implode(','$_POST['levels']);

 

however, here is a solution for you. The one thing it does not do is prevent a user from entering the same value twice (as long as the value is between 1-7), but it does ensure it matches the pattern you specified and does not contain more than seven digits.

function checkLevels($levelsString)
{
    return (preg_match("#^[1-7]{1}(,[1-7]{1}){0,6}$#", $levelsString)!==0);
}

//Testing array
$testvalues = array(
    "1",
    "1,2",
    "11,3,4",
    "1,2,,4",
    "1,2,",
    "1,2,3,4,5,6,7",
    "",
    "1,2,3,8",
    "1,2,3,4,5,6,7,7"
);
//Test process
foreach($testvalues as $value)
{
    $response = (checkLevels($value)) ? 'Pass' : 'Fail';
    echo "[{$value}]: {$response}<br>\n";
}

 

Test results

[1]: Pass
[1,2]: Pass
[11,3,4]: Fail
[1,2,,4]: Fail
[1,2,]: Fail
[1,2,3,4,5,6,7]: Pass
[]: Fail
[1,2,3,8]: Fail
[1,2,3,4,5,6,7,7]: Fail

Why not store the access levels in a bitwise method?

 

http://www.litfuel.net/tutorials/bitwise.htm

 

1 - 1

2 - 2

3 - 4

4 - 8

5 - 16

6 - 32

7- 64

 

So someone who's 1,3,5 would be 1+4+16 = 21. You can check if someone has level 5 by doing

 

If( $accessInteger & 16 ) {

 

}

 

The website does a great job of explaining what bitwise is and gives specific examples relevant to this discussion

 

Storing in int rather than varchar saves you a TON of database space as well, and makes things faster :D

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.