문자열에서 숫자가 아닌 문자 (마침표와 쉼표 제외)를 제거합니다


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 2012

5
[^ 0-9]는 숫자가 아닌 문자와 일치하므로 쉼표와 마침표를 추가 할 필요가 없습니다. 이것으로 충분합니다. echo preg_replace ( '/ [^ 0-9] /', '', $ testString);
billrichards

6
@ billrichards 나는 그것이 맞지 않다고 생각합니다. 그는 쉼표와 마침표를 숫자 문자와 함께 유지하고 싶지만 제거하지 않으려한다는 것을 기억하십시오.
Richt222

1
@billrichards OP가 언급했듯이 (강조 광산) " 쉼표와 점을 제외한 알파벳이나 문자는 피하십시오 ".
John Parker

그 기간에 백 슬래시가 필요하지 않습니까? 마침표는 "어떤 캐릭터"도 아닌가?
Scott

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
IMO가 최선의 답변입니다.
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 ()살균 필터에 대한 자세한 내용을 보려면


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"

중요 : 문자열에서 문자 만 제거합니다. 공백, 괄호, 따옴표 등과 같은 다른 문자는 결과 안에 유지됩니다. -> 입력 문자열에 문자와 숫자 만 포함되고 다른 문자는 포함되어 있지 않다면이 솔루션 만 사용하십시오!
Philipp

-1

middaparka과 동일 대답하지만 를 제거,.

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

게시물에 블로그 / 사이트에 대한 링크를 추가하지 마십시오. 스팸으로 간주 될 수 있습니다.
Tushar

Downvote : middaparka의 답변이 완벽했기 때문에. OP는 점과 쉼표를 유지하려고하지만 대답은 제거합니다.
Carlos2W
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.