2009-06-23 75 views
2

我可能在我的正則表達式知識中有一個漏洞。在正則表達式中的數字範圍

如果我正在嘗試查找可能位於數字範圍內的字符串中的項目,「項目[355-502]」是否有一個簡單的方法來執行此操作。據我可以告訴我將不得不做一些像

(35[5-9]|3[6-9][0-9]|4[0-9][0-9]|50[0-2]) 

我知道這也爲3550-5020等相匹配,這應該是罰款

This,表示這不能做任何其他方式,這是正確的。我在PHP中有一個更好的方法來做到這一點?

+1

是的,這是你如何使用正則表達式來完成它,因爲充其量它們處理數字而不是數字。將^和$添加到開頭,然後篩選超出範圍的數字。是否有理由需要用正則表達式來檢查,在這種情況下是一個尷尬的工具? – 2009-06-23 12:48:32

+0

感謝您的回答,並確認我認爲我所知道的。 – 2009-06-24 10:42:26

回答

9

這是一個數字問題,而不是一個字符串問題,所以我擔心你的解決方案不完全在於一個正則表達式!

您需要解析的數字,然後執行數值比較,如:

$input = whatever(); # gets something like "item[456]" 

...然後用下面的模式匹配:

preg_match("/item\[(\d+)\]/", $input, $match); 

...來存儲數字在內存中,然後:

if($match[1] >= 355 and $match[1] <= 502){... 

檢查數字是否在範圍內。

3

我能想到的唯一方法就是保持正則表達式簡單(item [0-9] {3})並執行代碼中的其餘檢查。正則表達式不能解決所有問題:)

1

匹配數字然後進行數字比較怎麼辦?

[email protected]:~$ more val.php 
<?php 
function validateItem($item) { 

    $matches = array(); 
    preg_match("/item(\d+)/",$item, $matches); 
    if ($matches[1] < 355 || $matches[1] > 502) return false; 
    return true; 

} 

var_dump(validateItem("item305")); 
var_dump(validateItem("item355")); 
var_dump(validateItem("item356")); 
var_dump(validateItem("item5454")); 
?> 
[email protected]:~$ php val.php 
bool(false) 
bool(true) 
bool(true) 
bool(false)