嗯,這不會是一個微不足道的正則表達式,我可以告訴你。您可以做這樣的事情:
$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'
,而不是上面巨大的野獸......
請不要使用正則表達式。這將會變得非常複雜。計算數字並明確比較。 – marcog 2011-02-18 16:55:03
正則表達式用於匹配模式,不檢查數值。用正則表達式查找一個可能的字符串,然後檢查它的數值,無論你的主機語言是什麼(PHP,無論)。 – 2013-06-02 05:28:06