我正在尝试preg_match()
在 PHP 中使用为具有此模式的 4 位数字进行模式匹配:
0033
1155
2277
基本上前 2 位数字相同,后 2 位数字相同,但并非所有 4 位数字都相同。
preg_match()
甚至可以使用正确的功能吗?还是我应该将它们分开并以这种方式匹配?
我正在尝试preg_match()
在 PHP 中使用为具有此模式的 4 位数字进行模式匹配:
0033
1155
2277
基本上前 2 位数字相同,后 2 位数字相同,但并非所有 4 位数字都相同。
preg_match()
甚至可以使用正确的功能吗?还是我应该将它们分开并以这种方式匹配?
要在文本中搜索这种数字,您可以使用:
preg_match('~\b(\d)\1(?!\1)(\d)\2\b~', $str, $m)
(或者preg_match_all
如果你想要所有这些)
细节:
~ # pattern delimiter
\b # word boundary (to be sure that 1122 isn't a part of 901122)
(\d) # capture the first digit in group 1
\1 # back-reference to the group 1
(?!\1) # negative lookahead: check if the reference doesn't follow
(\d) #
\2 #
\b # word boundary (to be sure that 1122 isn't a part of 112234)
~ #
如果要检查整个字符串是否为数字,请使用字符串限制锚点代替单词边界:
~\A(\d)\1(?!\1)(\d)\2\z~
您可以使用类似于array_filter
比较回调的东西:
function compare($number) {
// Compare first 2 numbers
if (intval($number[0]) !== intval($number[1])) {
return false;
}
// Compare last 2 numbers
if (intval($number[2]) !== intval($number[3])) {
return false;
}
// Make sure first and last numbers aren't the same
if (intval($number[0]) === intval($number[3])) {
return false;
}
return true;
}
$data = array_filter($data, 'compare');
你也可以使用闭包来做到这一点:
$data = array_filter($data, function($number) {
return intval($number[0]) === intval($number[1]) && intval($number[2]) === intval($number[3]) && intval($number[0]) !== intval($number[3]);
});
这里的例子:http: //ideone.com/0VwJz8