2017-08-25 3 views
2

Nach anweist Kunden zur Eingabe zu reinigen nureleganteste Möglichkeit eine Zeichenkette in nur durch Kommata getrennte Ziffern

Anzahl comma Zahl comma Nummer

(keine festgelegte Länge, aber im Allgemeinen < 10), der Die Ergebnisse ihrer Eingabe waren, ähm, unvorhersehbar.

das folgende Beispiel Eingabe Gegeben:

3,6 ,bannana,5,,*, 

Wie konnte ich am einfachsten und am Ende sicher mit:

3,6,5 

Bisher habe ich eine Kombination versuche:

$test= trim($test,","); //Remove any leading or trailing commas 
$test= preg_replace('/\s+/', '', $test);; //Remove any whitespace 
$test= preg_replace("/[^0-9]/", ",", $test); //Replace any non-number with a comma 

Aber bevor ich weiter damit werfe ... gibt es einen eleganten Weg, wahrscheinlich von einem Regex-Star!

+3

Ich denke, anstatt nur die Eingabe zu reinigen, sollten Sie auch Eingabe Validierung mit Javascript setzen –

+0

Das ist eine sehr gute Idee, war mir entfallen! – mayersdesign

+0

Sie könnten auch den Browser damit umgehen, indem Sie die Eingabe-Nummer https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input – rypskar

Antwort

3

In einem rein abstrakten Sinne ist es das, was ich tun würde:

$test = array_filter(array_map('trim',explode(",",$test)),'is_numeric') 

Beispiel: http://sandbox.onlinephpfunctions.com/code/753f4a833e8ff07cd9c7bd780708f7aafd20d01d

+0

Das ist sehr interessant, vor allem, wie ich am Ende mit einem Array enden würde – mayersdesign

+0

Das hat perfekt funktioniert in meinem Fall vielen Dank. Ich nahm an, dass Benutzer Punkte als Kommas eingeben wollten, verwendeten dafür einen preg_replace und wandelten sie dann unter Verwendung Ihres Codes in ein Array um. Fügen Sie jetzt auch eine JavaScript-Validierung gemäß dem obigen Kommentar hinzu. Danke noch einmal. – mayersdesign

1
<?php 
$str = '3,6 ,bannana,5,,*,'; 
$str = explode(',', $str); 
$newArray = array_map(function($val){ 
    return is_numeric(trim($val)) ? trim($val) : ''; 
}, $str); 
print_r(array_filter($newArray)); // <-- this will give you array 
echo implode(',',array_filter($newArray)); // <--- this give you string 
?> 
+0

Ich sehe die Idee, vielen Dank, aber scheint eine Menge Code für das, was ich angenommen habe, eine Regex Stripping-Übung sein würde. Könnten Sie bitte erklären, warum das nicht auf "einfache" Weise gemacht werden kann? – mayersdesign

+0

Da die Zeichenfolge Zahlen, Wörter und Leerzeichen enthält. Also müssen wir trimmen, nach Zahlen suchen und filtern. –

+0

Es ist tatsächlich die gleiche Menge Code wie für die angenommene Antwort. – localheinz

1

Hier ist ein Beispiel regex,

$string = '3,6 ,bannana,5,-6,*,'; 

preg_match_all('#(-?[0-9]+)#',$string,$matches); 

print_r($matches); 

ausgeben wird

Array 
(
    [0] => Array 
     (
      [0] => 3 
      [1] => 6 
      [2] => 5 
      [3] => -6 
     ) 

    [1] => Array 
     (
      [0] => 3 
      [1] => 6 
      [2] => 5 
      [3] => -6 
     ) 

) 

Verwenden Sie $matches[0] und Sie sollten auf Ihrem Weg sein.
Wenn Sie keine negativen Zahlen benötigen, entfernen Sie einfach das erste Bit in der Regex-Regel.

+0

Vielen Dank, ich wusste, dass es einen Regex-Weg geben würde ... gibt es immer! Haha – mayersdesign

Verwandte Themen