Scott
Scott

Reputation: 1872

Validate string to be 10-digits long with first 5 as the same digit and the second 5 as the same digit

I'm trying to port this Java to PHP:

String _value = '1111122222';
if (_value.matches("(1{5}|2{5}|3{5}|4{5}|5{5}|6{5}|7{5}|8{5}|9{5}){2}")) {
    // check for number with the same first 5 and last 5 digits 
    return true;
}

As the comment suggests, I want to test for a string like '1111122222' or '5555566666'

How can I do this in PHP?

Upvotes: 1

Views: 545

Answers (4)

Jason McCreary
Jason McCreary

Reputation: 72991

Conversion is below. preg_match() is the key: http://www.php.net/preg_match

$value = '1111122222';
if (preg_match('/^(1{5}|2{5}|3{5}|4{5}|5{5}|6{5}|7{5}|8{5}|9{5}){2}$/', $value)) {
    // check for number with the same first 5 and last 5 digits 
    return true;
}

Upvotes: 0

Gumbo
Gumbo

Reputation: 655269

You can use preg_match to do so:

preg_match('/^(1{5}|2{5}|3{5}|4{5}|5{5}|6{5}|7{5}|8{5}|9{5}){2}$/', $_value)

This returns the number of matches (i.e. either 0 or 1) or false if there was an error. Since the String’s matches method returns only true if the whole string matches the given pattern but preg_match doesn’t (a substring suffices), you need to set markers for the start and the end of the string with ^ and $.

You can also use this shorter regular expression:

^(?:(\d)\1{4}){2}$

And if the second sequence of numbers needs to be different from the former, use this:

^(\d)\1{4}(?!\1)(\d)\2{4}$

Upvotes: 3

Svisstack
Svisstack

Reputation: 16616

$f = substr($_value, 0, 5);
$s = substr($_value, -5);
return (substr_count($f, $f[0]) == 5 && substr_count($s, $s[0]) == 5);

Upvotes: 0

ircmaxell
ircmaxell

Reputation: 165201

Well, you could do:

$regex = '/(\d)\1{4}(\d)\2{4}/';
if (preg_match($regex, $value)) {
    return true;
}

Which should be much more efficient (and readable) than the regex you posted...

Or, an even shorter (and potentially cleaner) regex:

$regex = '/((\d)\2{4}){2}/';

Upvotes: 3

Related Questions