正则表达式进行数字比较?

时间:2011-02-18 16:51:25

标签: php regex numbers compare permutation

如果输入5位来自数据库中的输入匹配数据,我想执行正则表达式返回true / false,不需要满足序列,但需要确切的数字。

例如:在数据库中我有12345

当我将5位数值输入搜索时,我想知道它是否与12345中的每个数字相匹配。

如果我键入34152-它应该返回true

如果我键入14325-它应该返回true

如果我键入65432-它应该返回false

如果我输入11234-它应该返回false

例如:在数据库中我有44512

如果我输入21454-它应该返回true

如果我输入21455-它应该返回false

如何使用带有正则表达式的php

进行此操作

3 个答案:

答案 0 :(得分:3)

这是一种避免正则表达式的方法

<?php
function cmpkey($a,$b){
  $aa =  str_split($a); sort($aa);
  $bb =  str_split($b); sort($bb);
  return ( implode("",$aa) == implode("",$bb));
}
?>

答案 1 :(得分:2)

嗯,这不会是一个微不足道的正则表达式,我可以告诉你。您可以执行以下操作:

$chars = count_chars($input, 1);
$numbers = array();
foreach ($chars as $char => $frequency) {
    if (is_numeric(chr($char))) {
        $numbers[chr($char)] = $frequency;
    }
}
// that converts "11234" into array(1 => 2, 2 => 1, 3 => 1, 4 => 1)

现在,由于MySQL不支持正则表达式中的断言,因此您需要在多个正则表达式中执行此操作:

$where = array();
foreach ($numbers AS $num => $count) {
    $not = "[^$num]";
    $regex = "^";
    for ($i = 0; $i < $count; $i++) {
        $regex .= "$not*$num";
    }
    $regex .= "$not*";
    $where[] = "numberField REGEXP '$regex'";
}

$where = '((' . implode(') AND (', $where).'))';

那会产生:

( 
        (numberField REGEXP '^[^1]*1[^1]*1[^1]*$') 
    AND 
        (numberField REGEXP '^[^2]*2[^2]*$')
    AND
        (numberField REGEXP '^[^3]*3[^3]*$')
    AND
        (numberField REGEXP '^[^4]*4[^4]*$')
)

那应该为你做。

它不漂亮,但它应该照顾所有可能的排列,假设你的存储数据格式是一致的......

但是,根据您的需要,您应该尝试将其解决并在PHP中处理它。在这种情况下,正则表达式会简单得多:

^(?=.*1.*1})(?=.*2)(?=.*3)(?=.*4)\d{5}$

或者,您也可以在插入数字之前对其进行预排序。因此,您不必插入14231,而是插入11234。这样,你总是知道顺序是正确排序的,所以你只需要做numberField = '11234'而不是上面那个巨大的野兽......

答案 2 :(得分:1)

尝试使用

^(?=.*1)(?=.*2)(?=.*3)(?=.*4)(?=.*5).{5}$

如果您有重复的数字,这将变得更加复杂。 你真的不应该用正则表达式来做这件事。 =)