2009-06-23 21 views
2

Ich habe vielleicht ein Loch in meinem Regex Knowlege.Nummernbereich in einer Regex

Wenn ich für Elemente in einer Zeichenfolge zu suchen bin versucht, die in dem numerischen Bereich liegen „item [355-502]“ ist es eine einfache Möglichkeit, dies zu tun. soweit ich sagen kann, ich würde so etwas wie

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

ich dies auch für 3550-5020 Spiele kennen zu tun haben, usw., die

This, in Ordnung sein sollte darauf hinweisen, dass dies nicht geschehen auf jede andere Weise, ist das richtig. Ich bin in PHP gibt es einen besseren Weg, dies zu tun?

+1

Ja, dies ist, wie Sie es mit regulären Ausdrücken tun müssen, weil sie im besten Fall Zahlen und nicht Zahlen verwenden. Füge^und $ an den Anfang und und um Zahlen außerhalb deines Bereichs zu filtern. Gibt es einen Grund, dass Sie mit einem regulären Ausdruck überprüfen müssen, ein umständliches Werkzeug in diesem Zusammenhang? –

+0

Danke für die Antworten und bestätigen, was ich dachte, dass ich wusste. –

Antwort

9

Dies ist ein numerisches Problem eher als ein String Problem, so fürchte ich Ihre Lösung nicht vollständig liegt in einem regulären Ausdruck!

Sie müssen die Ziffern analysieren und dann numerischen Vergleich durchführen, zum Beispiel:

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

... dann mit dem folgenden Muster entsprechen:

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

... die Ziffern zu speichern im Speicher und dann:

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

, um zu überprüfen, ob die Nummer in Reichweite ist.

+0

Das ist mehr oder weniger was ich getan habe. Vielen Dank –

3

Die einzige andere Art, wie ich denken kann, wäre den Regex einfach zu halten (Punkt [0-9] {3}) und macht den Rest der Überprüfung im Code. Reguläre Ausdrücke können nicht alle Probleme lösen :)

1

Wie wäre es, die Ziffern zu vergleichen und dann einen numerischen Vergleich durchzuführen?

[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)