Regex для сравнения чисел? - PullRequest
0 голосов
/ 18 февраля 2011

Я хотел бы выполнить регулярное выражение, чтобы вернуть истину / ложь, если введенные 5 цифр из входных данных сопоставления в базе данных, не нужно обслуживать последовательности, но нужны точные числа.

Например: в базе данных у меня 12345

Когда я ввожу в поиск 5-значное значение, я хочу выяснить, соответствует ли оно каждому числу внутри 12345.

Если я введу 34152, он должен вернуть true

Если я введу 14325, он должен вернуть true

Если я введу 65432, он должен вернуть false

Если я введу 11234, он должен вернуть false

Например: в базе данных у меня 44512

Если я введу 21454, он должен вернуть true

Если я введу 21455, он должен вернуть false

Как это сделать используя php с регулярным выражением

Ответы [ 3 ]

3 голосов
/ 18 февраля 2011

Это способ избежать регулярных выражений

<?php
function cmpkey($a,$b){
  $aa =  str_split($a); sort($aa);
  $bb =  str_split($b); sort($bb);
  return ( implode("",$aa) == implode("",$bb));
}
?>
2 голосов
/ 18 февраля 2011

Ну, это не будет тривиальным регулярным выражением, я могу вам это сказать. Вы могли бы сделать что-то вроде этого:

$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' вместо того гигантского зверя выше ...

1 голос
/ 18 февраля 2011

Попробуйте использовать

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

Это будет намного сложнее, если у вас есть дубликаты номеров.Вы действительно не должны делать это с помощью регулярных выражений.=)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...