2010-10-15 13 views

Antwort

3

Sie können is_numeric() mit der Einschränkung verwenden, dass es ein bisschen akzeptiert, mehr als man normalerweise wünscht (z. B. 1e4).

0

Warum nicht einfach is_numeric verwenden, wenn Sie keine Erfahrung mit regulären Ausdrücken haben.

In Bezug auf Ihre Regex: . passt alle Zeichen, \. entspricht einem Punkt. {1} ist nicht erforderlich. Und ich habe keine Ahnung, was Sie mit [^ ... ] zu tun versuchen. Lesen Sie regular expressions tutorial, wenn Sie in Ihrem Code wirklich reguläre Ausdrücke verwenden möchten.

20
/^-?(?:\d+|\d*\.\d+)$/ 

Dies entspricht normalen Schwimmern z.B. 3.14, Kürzel nur für den Dezimalteil z.B. .5 und ganze Zahlen, z.B. 9 sowie negative Zahlen.

+1

Sie müssen den Wechsel in Klammern einschließen, sonst wird der Anker für den Anfang der Zeichenfolge nur mit Ganzzahlen und der Anker für den Ende der Zeichenfolge nur mit Dezimalstellen erzwungen. –

+0

Guter Fang, behoben. –

+0

Das funktioniert bei INT auch für mich. Vielen Dank. – Strabek

14

das ist, was Sie suchen

$re = "~  #delimiter 
    ^   # start of input 
    -?   # minus, optional 
    [0-9]+  # at least one digit 
    (   # begin group 
     \.  # a dot 
     [0-9]+ # at least one digit 
    )   # end of group 
    ?   # group is optional 
    $   # end of input 
~xD"; 

dies akzeptiert nur "123" oder "123.456", nicht“0,123" oder "14e + 15". Wenn Sie diese Formulare ebenfalls benötigen, versuchen Sie es mit is_numeric

+6

+1 für Schritt für Schritt kommentieren – alex

+0

Für was ist das D? – AntonioCS

+0

@AntonioCS ist es für $ Endbegrenzer [ref über PCRE Modifikatoren] (http://php.net/manual/en/reference.pcre.pattern.modifiers.php) 'D (PCRE_DOLLAR_ENDONLY) Wenn dieser Modifikator ist gesetzt, stimmt ein Dollar-Metazeichen im Muster nur am Ende der Betreff-Zeichenfolge überein. Ohne diesen Modifikator entspricht ein Dollar auch unmittelbar vor dem letzten Zeichen, wenn es sich um einen Zeilenumbruch handelt (jedoch nicht vor allen anderen Zeilenumbrüchen).Dieser Modifikator wird ignoriert, wenn der Modifikator m gesetzt ist. Es gibt keine Entsprechung zu diesem Modifizierer in Perl. FYI: das x ist für Extended: zum Unterdrücken irgendwelcher Leerzeichen Zeichen – MediaVince

5

Reguläre Ausdrücke sind für übereinstimmende Zeichenfolge-Muster. Wenn Sie nicht explizit sind nach der Eingabezeichenfolge des Formats Validierung (aber der tatsächlichen Wertes), können Sie auch

filter_var("1.33", FILTER_VALIDATE_FLOAT); 

, um sicherzustellen, kann der Eingang als Float-Wert verwendet werden. Dies wird FALSE zurückgeben, wenn es kein Float ist und ansonsten der Float- oder Integer-Wert. Alle type juggling Regeln gelten.

+0

Dies entspricht nicht den OP-Anforderungen/Beschreibung: z. es erlaubt '123e-4' – salathe

+0

@salathe ja, wie gesagt: benutze es, wenn du hinter dem * Wert * stehst. Benutze es nicht, wenn du das * string Format * validierst. '123e-4' ist immer noch ein float (' 0.123'). – Gordon

1

Diese Regex:

\d*(?:\.\d+)? 

werden die Ergebnisse geben:

123 -> true 
123.345 -> true 
123. -> true 
.345 -> true 
0.3345 -> true 

Sie müssen jedoch die Leere des Eingangs überprüfen, bevor Sie es, weil die Regex auch Länge Null Eingabe ermöglichen.