1

I need a string which consists of some numbers, comma, undersocre, slash, hyphen and space.

I am almost ok. Here is my code so far.

$regex = '#^[0-9-_,/\s]+$#';
if(preg_match($regex, $string)){
    return true;
} else {
    return false;
}

But I want to contain at least 4 digit within 0 to 9.

for example, These are the values I want to valid:

09-12345678
123, 456, 789
12/ 34/ 56

These are the values I don't want to valid:

1,2
3/5/6
7-8-9

So, I tried like this.

$regex = '#^[0-9-_,/\s]{4,100}$#';

And,

$regex = '#^[0-9{4,100}-_,/\s]+$#';

But they are not true too. How can I do?

1 Answers1

2

You can use a lookahead based regex:

~^(?=(?:\D*\d){4})[-0-9_,/\s]+$~

RegEx Demo

  • (?=(?:\D*\d){4}) is lookahead to assert presence of at least 4 digits in input.
  • Also important is to keep hyphen at start or end in character class [...]
anubhava
  • 761,203
  • 64
  • 569
  • 643
  • For OP: Revo's comment has `-` in middle which is not correct. And \`D*` is more efficient that `.*`. @Jan `\w` will also match `[a-zA-Z]` which wasn't included in OP's character class. – anubhava Jul 01 '16 at 10:06
  • 1
    Although I copied that set from question, a `-` in middle of a character set does not make problem when is immediately preceded by another valid range. So it works (OP confirmed already). But I am sure `\D*` is much more efficient and I accept that part. – revo Jul 01 '16 at 11:08