Xóa các ký tự không phải là số (trừ dấu chấm và dấu phẩy) khỏi chuỗi


150

Nếu tôi có các giá trị sau:

 $var1 = AR3,373.31

 $var2 = 12.322,11T

Làm cách nào tôi có thể tạo một biến mới và đặt nó thành một bản sao của dữ liệu đã loại bỏ bất kỳ ký tự không phải là số nào, ngoại trừ dấu phẩy và dấu chấm? Các giá trị trên sẽ trả về kết quả sau:

 $var1_copy = 3,373.31

 $var2_copy = 12.322,11

Câu trả lời:


335

Bạn có thể sử dụng preg numplace để trao đổi tất cả các ký tự không phải là số và dấu phẩy và dấu chấm / dấu chấm đầy đủ như sau:

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

6
xem thêm php function money_function () ( php.net/manual/en/function.money-format.php )
Horatio

5
[^ 0-9] sẽ khớp với bất kỳ ký tự không phải là số nào, do đó không cần thiết phải thêm dấu phẩy và dấu chấm hết. Điều này là đủ: echo preg numplace ('/ [^ 0-9] /', '', $ testString);
billrichards 18/03 '

6
@billrichards Tôi không nghĩ đó là chính xác. Hãy nhớ rằng anh ta muốn giữ lại dấu phẩy và dừng hoàn toàn, cùng với các ký tự số, không xóa chúng.
Richt222

1
@billrichards Như OP đã nêu (nhấn mạnh của tôi), "tránh bảng chữ cái hoặc ký tự trừ dấu phẩy và dấu chấm ".
John Parker

thời kỳ đó không cần dấu gạch chéo? dấu chấm có nghĩa là "bất kỳ nhân vật" nào không?
Scott

66

Tôi ngạc nhiên không có đề cập đến bộ lọc_var ở đây vì đây là một câu hỏi cũ ...

PHP có một phương thức tích hợp để thực hiện việc này bằng các bộ lọc khử trùng . Cụ thể, một để sử dụng trong tình huống này là FILTER_SANITIZE_NUMBER_FLOATvới các FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSANDcờ. Thích như vậy:

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

Cũng đáng lưu ý rằng vì nó được tích hợp sẵn trong PHP, nên nó nhanh hơn một chút so với sử dụng regex với các thư viện hiện tại của PHP (mặc dù theo nghĩa đen là nano giây).


2
IMO đây là câu trả lời tốt nhất.
Ogier Schelvis


4

Bạn có thể sử dụng filter_varđể xóa tất cả các ký tự không hợp lệ trừ chữ số, dấu chấm và dấu phẩy.

  • Bộ FILTER_SANITIZE_NUMBER_FLOATlọc được sử dụng để xóa tất cả các ký tự không phải là số khỏi chuỗi.
  • FILTER_FLAG_ALLOW_FRACTION đang cho phép phân tách phân số " . "
  • Mục đích của FILTER_FLAG_ALLOW_THOUSANDviệc lấy dấu phẩy từ chuỗi.

$var1 = '12.322,11T';

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

Đầu ra

12.322,11

Để đọc thêm về bộ lọc filter_var ()khử trùng


2

Nếu yêu cầu là loại bỏ tất cả (và không chỉ một) char không phải là số, thì có thể trước đó có thể được viết như thế này theo cách rất đơn giản (nhưng bạn có thể viết một hàm để truyền chuỗi và làm cho nó trả về giá trị cần thiết mà không cần ký tự .. dù sao..):

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

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

1

Nếu các chữ cái luôn ở đầu hoặc cuối, bạn chỉ cần sử dụng trim ... không cần regex

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

Quan trọng: Điều này sẽ chỉ loại bỏ các chữ cái từ chuỗi. Các ký tự khác, chẳng hạn như dấu cách, dấu ngoặc, dấu ngoặc kép, v.v ... được giữ bên trong kết quả. -> Chỉ sử dụng giải pháp này, nếu bạn biết rằng chuỗi đầu vào của bạn chỉ chứa các chữ cái và số và không có ký tự nào khác!
Philipp

-1

Câu trả lời tương tự như middaparka nhưng loại bỏ,.

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

Vui lòng không thêm các liên kết đến blog / trang web của bạn trong bài viết. Đó có thể được coi là thư rác.
Tushar

Downvote: Bởi vì câu trả lời của middaparka là hoàn hảo. OP muốn giữ dấu chấm và dấu phẩy nhưng câu trả lời của bạn sẽ loại bỏ chúng.
Carlos2W
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.