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

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

 $var1 = AR3,373.31

 $var2 = 12.322,11T

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

 $var1_copy = 3,373.31

 $var2_copy = 12.322,11

Ответ 1

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

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

Ответ 2

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

PHP имеет встроенный метод, используя фильтры для очистки. В частности, тот, который будет использоваться в этой ситуации, FILTER_SANITIZE_NUMBER_FLOAT с флагами 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 (хотя и буквально в наносекундах).

Ответ 3

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

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

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

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

Ответ 4

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

<?php
$String1 = 'AR3,373.31';
$String2 = '12.322,11T';

echo preg_replace('/[^0-9,.]+/i', '', $String1);
echo preg_replace('/[^0-9,.]+/i', '', $String2);
?>

Ответ 5

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

$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"

Ответ 6

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

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