Адская проверка при валидации входного параметра


Исходный код

if ( strchr ( $_POST["ship$i"], "+") || strchr($_POST["ship$i"], " ") || strchr($_POST["ship$i"], ",") || strchr($_POST["ship$i"], ".") || strchr($_POST["ship$i"], "-") || strchr($_POST["ship$i"], "_") || strchr($_POST["ship$i"], ";") || strchr($_POST["ship$i"], ":") ) { 
message("You got owned by >>The_Revenge Anticheat Systems<<", "Anticheat");
}
if ( !strchr ( $_POST["ship$i"], "+") && !strchr($_POST["ship$i"], " ") && !strchr($_POST["ship$i"], ",") && !strchr($_POST["ship$i"], ".") && !strchr($_POST["ship$i"], "-") && !strchr($_POST["ship$i"], "_") && !strchr($_POST["ship$i"], ";") && !strchr($_POST["ship$i"], ":")) {
// код
}

Исходный код делает проверку входного параметра на наличие целого числа без знака.

Как можно улучшить код

Сначала понимаем, что первый и второй if — в точности противоположны друг другу и вместо второго стоит написать просто else.

if ( strchr ( $_POST["ship$i"], "+") || strchr($_POST["ship$i"], " ") || strchr($_POST["ship$i"], ",") || strchr($_POST["ship$i"], ".") || strchr($_POST["ship$i"], "-") || strchr($_POST["ship$i"], "_") || strchr($_POST["ship$i"], ";") || strchr($_POST["ship$i"], ":") ) { 
message("You got owned by >>The_Revenge Anticheat Systems<<", "Anticheat");
}
else {
// код
}

Избавились от мусорного кода.

Дальше стоит обратить внимание на изобилие повторов входного параметра, а также смешение знаний: как проверить валидность входного параметра и что делать, если параметр не валидный. Разделяем знания путём вынесения проверки в отдельную функцию.

function isShipValid( $ship ) {
    return strchr ( $ship, "+") || strchr($ship, " ") || strchr($ship, ",") || strchr($ship, ".") || strchr($ship, "-") || strchr($ship, "_") || strchr($ship, ";") || strchr($ship, ":");
}
if ( isShipValid( $_POST["ship$i"] ) ) {
    message("You got owned by >>The_Revenge Anticheat Systems<<", "Anticheat");
}
else {
    // код
}

Теперь валидность параметра «корабль» можно проверять в любом месте проекта.

И наконец, вишенка на торте: а почему, собственно, наличие целого положительного числа проверяется столь замысловатым способом? Да при этом ещё и некорректным?

Самый короткий и надёжный способ проверить, что строка состоит только из цифр — использовать простое регулярное выражение:

function isShipValid( $ship ) {
    return preg_match( '/^(\d+)$/', $ship );
}

Теория