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


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 функцію money_function () ( php.net/manual/en/function.money-format.php )
horatio

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

6
@billrichards Я не думаю, що це правильно. Пам'ятайте, що він хоче зберегти кому та повну зупинку разом із цифровими символами, а не видаляти їх.
Ріхт222

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
ІМО це найкраща відповідь.
Ogier Schelvis


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

Відповідь така ж, як і middaparka, але видаліть,.

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

Будь ласка, не додайте посилань до свого блогу / сайту в публікаціях. Це може розглядатися як спам.
Тушар

Downvote: Тому що відповідь Міддапарки була ідеальною. ОП хочуть зберегти крапки і коми, але ваша відповідь видалити їх.
Carlos2W
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.