5

I'm trying to remove all non-numeric characters from my code, but FILTER_SANITIZE_NUMBER_INT allows plus and minus signs.

How can I remove them using PHP that I can add to my code?

Here is my code.

$a = filter_var($a, FILTER_SANITIZE_NUMBER_INT);
Braiam
  • 1
  • 11
  • 50
  • 74

2 Answers2

4

I went with the following solution. Uppercase "D" stands for "non-digit".

public static function sanitize_integer($str)
{
    return (int) preg_replace('/\D/', '', $str);
}

If your input string may have leading zeros that you wish to retain, do not cast the mutated string as an integer.

return preg_replace('/\D/', '', $str);

To make fewer replacements (but the same result), use the + (one or more quantifier) to remove multiple consecutive non-numeric characters during each replacement.

return preg_replace('/\D+/', '', $str);
mickmackusa
  • 37,596
  • 11
  • 75
  • 105
Sasse
  • 1,058
  • 10
  • 14
3

In this case, you may want to consider simply casting the result to an int to remove the plus (+) sign.

$a = (int) filter_var($a,FILTER_SANITIZE_NUMBER_INT);

If you need to drop the minus (-) sign as well, effectively getting the number's absolute value, use PHP's abs() function:

$a = abs((int) filter_var($a,FILTER_SANITIZE_NUMBER_INT));
bitsoflogic
  • 1,094
  • 2
  • 14
  • 27
  • Downvoted since "123-456" returns "123" and not "123456" which I would like. – Sasse Feb 24 '17 at 09:20
  • "123-456" isn't an int because it contains a dash. You're looking for `str_replace('-', '', "123-456")` http://php.net/manual/en/function.str-replace.php. – bitsoflogic Feb 24 '17 at 21:49
  • Did you read OP's question? He's trying to remove all "non numeric characters" including the removal of "plus and minus signs". – Sasse Apr 04 '17 at 12:20
  • @Sasse I guess I interpreted it differently at the time, since he seemed to clarify he was trying to strip a leading plus or minus sign. That being said, your interpretation and answer does seem more spot on. I'd definitely use regex to solve it as well. – bitsoflogic Apr 04 '17 at 14:21