2009-06-23 59 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)