intval()
behaves sometimes a little bit counter-intuitive when then value has leading zeros or when it is a mathematic expression. The result should always be safe, but is not always what you might expect.
A simple example:
intval( '9223372036854775808' );
will never return this value, because even 64 bit system cannot handle such a large number. You get 9223372036854775807
on a 64 bit system and 2147483647
on 32 bit.
But if you use:
preg_match( '~\d+~', '9223372036854775808', $matches );
$matches[0]
will return this number unchanged.
So, it depends on the values you expect.