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


150

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

 $var1 = AR3,373.31

 $var2 = 12.322,11T

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

 $var1_copy = 3,373.31

 $var2_copy = 12.322,11

Ответы:


335

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

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

6
см. также php function money_function () ( php.net/manual/en/function.money-format.php )
Горацио,

5
[^ 0-9] будет соответствовать любому нечисловому символу, поэтому нет необходимости добавлять запятую и точку остановки. Этого достаточно: echo preg_replace ('/ [^ 0-9] /', '', $ testString);
billrichards

6
@billrichards Я не думаю, что это правильно. Помните, что он хочет сохранить запятую и точку остановки вместе с числовыми символами, а не удалять их.
Richt222

1
@billrichards Как указано в ОП (выделено мной), «избегайте алфавитов или символов, кроме запятой и точки ».
Джон Паркер

этот период не нуждается в обратном слэше? точка означает "любой символ", не так ли?
Скотт

66

Я удивлен, что здесь не упоминается 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 (хотя буквально в наносекундах).


2
ИМО это лучший ответ.
Ожье Шелвис


4

Вы можете использовать, filter_varчтобы удалить все недопустимые символы, кроме цифр, точек и запятой.

  • FILTER_SANITIZE_NUMBER_FLOATФильтр используется для удаления всех нечисловой символ из строки.
  • FILTER_FLAG_ALLOW_FRACTION разрешает сепаратор фракции " . "
  • Цель FILTER_FLAG_ALLOW_THOUSANDполучить запятую из строки.

Код

$var1 = '12.322,11T';

echo filter_var($var1, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND);

Вывод

12.322,11

Чтобы узнать больше о фильтрах filter_var () и Sanitize


2

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

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

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

1

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

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

Важно: это удалит только буквы из строки. Другие символы, такие как пробелы, скобки, кавычки и т. Д., Сохраняются внутри результата. -> Используйте это решение, только если вы знаете, что ваша входная строка содержит только буквы и цифры, и никаких других символов!
Филипп

-1

Тот же ответ, что и у миддапарка, но удалите,.

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

Пожалуйста, не добавляйте ссылки на ваш блог / сайт в сообщениях. Это можно рассматривать как спам.
Тушар

Даунвот: Потому что ответ миддапарки был идеальным. ОП хотят сохранить точки и запятые, но ваш ответ удалить их.
Carlos2W
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.