如果输入5位来自数据库中的输入匹配数据,我想执行正则表达式返回true / false,不需要满足序列,但需要确切的数字。
例如:在数据库中我有12345
当我将5位数值输入搜索时,我想知道它是否与12345中的每个数字相匹配。
如果我键入34152-它应该返回true
如果我键入14325-它应该返回true
如果我键入65432-它应该返回false
如果我输入11234-它应该返回false
例如:在数据库中我有44512
如果我输入21454-它应该返回true
如果我输入21455-它应该返回false
如何使用带有正则表达式的php
进行此操作答案 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}$
如果您有重复的数字,这将变得更加复杂。 你真的不应该用正则表达式来做这件事。 =)