Удаление нечисловых символов (кроме периодов и запятых) из строки

Если у меня есть следующие значения:

$var1 = AR3,373.31 $var2 = 12.322,11T 

Как я могу создать новую переменную и установить ее на копию данных, в которых удалены любые нечисловые символы, за исключением запятых и периодов? Вышеуказанные значения вернут следующие результаты:

  $var1_copy = 3,373.31 $var2_copy = 12.322,11 

Вы можете использовать preg_replace для замены всех нецифровых символов и запятой и периода / полной остановки следующим образом:

 <?php $testString = "12.322,11T"; echo preg_replace("/[^0-9,.]/", "", $testString); ?> 

Я удивлен, что здесь не упоминается filter_var, потому что это такой старый вопрос …

PHP имеет встроенный метод для этого, используя фильтры очистки . В частности, тот, который будет использоваться в этой ситуации, – FILTER_SANITIZE_NUMBER_FLOAT с FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND . Вот так:

 $numeric_filtered = filter_var("AR3,373.31", FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND); echo $numeric_filtered; // Will print "3,373.31" 

Также может быть полезно отметить, что, поскольку он встроен в PHP, он немного быстрее, чем использование регулярных выражений с текущими библиотеками PHP (хотя и буквально в наносекундах).

Простейший способ по-настоящему удалить все нечисловые символы:

 echo preg_replace('/\D/', '', $string); 

\D представляет «любой символ, который не является десятичной цифрой»

http://php.net/manual/en/regexp.reference.escape.php

Если запрос состоит в удалении всего (и не только одного) нецифрового символа, возможно, предыдущий может быть написан таким образом очень простым способом (но вы можете написать функцию для передачи строки и заставить ее вернуть необходимое значение без символов .. так или иначе..):

 <?php $String1 = 'AR3,373.31'; $String2 = '12.322,11T'; echo preg_replace('/[^0-9,.]+/i', '', $String1); echo preg_replace('/[^0-9,.]+/i', '', $String2); ?> 

Если буквы всегда в начале или в конце, вы можете просто использовать обрезку … нет необходимости в регулярном выражении

 $string = trim($string, "a..zA..Z"); // this also take care of lowercase "AR3,373.31" --> "3,373.31" "12.322,11T" --> "12.322,11" "12.322,11" --> "12.322,11" 

Тот же ответ, что и middaparka, но удалите ,.

 $unformatted_phone = "phone 122-3222223.ext 442"; echo preg_replace("/[^0-9]/", "", $unformatted_phone);