Просто удалите все недопустимые символы и проверьте, имеет ли остальные действительный формат:
$cleaned = preg_replace('/[^-0-9]+/', '', $str);
if (preg_match('/^-?[0-9]+$/', $cleaned)) {
// now valid
}
Хорошо, вот еще одно предложение:
preg_replace('/.*?(-?\d+).*/', '$1', $str)