bir regex sayı aralığı

3 Cevap php

Benim regex bilgi birikimi bir delik olabilir.

Ben sayısal aralık "öğesi [355-502]" olabilir bir dize öğeleri aramak için çalışıyorum eğer bunu yapmanın kolay bir yolu var. bildiğim kadarıyla söyleyebilirim gibi ben böyle bir şey yapmak zorunda olurdu

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

I know this also matches for 3550-5020 etc, that should be fine

This, Bu başka bir şekilde yapılamaz belirtir, bu doğru. Bunu yapmak için bir kıvrımlara yol var PHP yaşıyorum?

3 Cevap

Bu sayısal bir sorun yerine bir dize sorundur, bu yüzden çözüm bir regex tamamen yalan değil korku!

Sen basamak ayrıştırmak ve sonra sayısal karşılaştırma, örneğin gerçekleştirmeniz gerekir:

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

... Sonra aşağıdaki deseni ile eşleşir:

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

... Sonra bellekte basamak saklamak, ve:

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

numarası aralığında olup olmadığını görmek için kontrol edin.

Aklıma diğer tek yolu regex basit (öğe [0-9] {3}) tutmak ve kod denetleme gerisini olacaktır. Düzenli ifadeler tüm sorunları çözemez :)

Ne basamak eşleşen ve daha sonra bir sayısal karşılaştırma yapıyor dersiniz?

vinko@mithril:~$ 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"));
?>
vinko@mithril:~$ php val.php
bool(false)
bool(true)
bool(true)
bool(false)