Ну, это не будет тривиальным регулярным выражением, я могу вам это сказать. Вы могли бы сделать что-то вроде этого:
$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'
вместо того гигантского зверя выше ...