0

我正在尝试preg_match()在 PHP 中使用为具有此模式的 4 位数字进行模式匹配:

0033
1155
2277

基本上前 2 位数字相同,后 2 位数字相同,但并非所有 4 位数字都相同。

preg_match()甚至可以使用正确的功能吗?还是我应该将它们分开并以这种方式匹配?

4

2 回答 2

3

要在文本中搜索这种数字,您可以使用:

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~
于 2017-06-17T01:50:15.960 回答
1

您可以使用类似于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

于 2017-06-17T00:33:27.397 回答