2011-02-18 59 views
0

我想執行正則表達式來返回true/false如果從輸入匹配數據在數據庫中的5位數字,不需要迎合序列,但需要確切的數字。用於數字比較的正則表達式?

如:在數據庫中,我有12345

當我在一個5位數的值到搜索鍵,我想看看它是否在每個號碼相匹配的12345

內如果我在關鍵34152-它應該返回true

如果我在14325-關鍵應該返回true

如果我在65432-關鍵應該返回false

如果在11234-我重點就應該返回false

如:在數據庫中,我有44512

如果我在21454-關鍵應該返回true

如果在21455-我重點就應該返回false

如何做到這一點使用PHP與正則表達式

+8

請不要使用正則表達式。這將會變得非常複雜。計算數字並明確比較。 – marcog 2011-02-18 16:55:03

+0

正則表達式用於匹配模式,不檢查數值。用正則表達式查找一個可能的字符串,然後檢查它的數值,無論你的主機語言是什麼(PHP,無論)。 – 2013-06-02 05:28:06

回答

1

嘗試使用

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

當你有重複的號碼時,這會變得更加複雜。 你真的不應該這樣做與正則表達式。 =)

+0

MySQL不支持斷言。如果確實如此,那很容易。但事實並非如此。所以這意味着你要麼像我在我的回答中那樣做濫用行爲,要麼將它拉出來並在php中用preg進行檢查...... – ircmaxell 2011-02-18 17:07:55

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',而不是上面巨大的野獸......

3

這是一種避免正則表達式

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