PHP - проверка на наличие первых 0 в двух целых числах, разделенных запятыми - PullRequest
0 голосов
/ 21 января 2019

У меня есть строка ввода с двумя целыми числами, разделенными запятыми.

Пример (ОК):

3,5

Я хочу отклонить любой пользовательский ввод, содержащий первые 0 для любого числа.

Примеры (плохо):

03,5
00005,3
05,003

Теперь, что я мог бы сделать, это разделить два числа на 2 отдельных string и использовать ltrim на каждом, а затем посмотреть, изменились ли они по сравнению с тем, что было выполнено до ltrim:

$string = "03,5";

$string_arr = explode(",",$string);

$string_orig1 = $string_arr[0];
$string_orig2 = $string_arr[1];

$string_mod1 = ltrim($string_orig1, '0');
$string_mod2 = ltrim($string_orig2, '0');

if (($string_mod1 !== $string_orig1) || ($string_mod2 !== $string_orig2)){
    // One of them had leading zeros!
}

.. но это кажется излишне многословным. Есть ли более чистый способ сделать это? Возможно с preg_match?

Ответы [ 5 ]

0 голосов
/ 21 января 2019

Все текущие ответы не будут выполнены, если любое из значений просто 0.

Вы можете просто преобразовать в целое число и обратно и сравнить результат.

$arr = explode(',', $input);
foreach($arr as $item) {
    if( (str)intval($item) !== $item ) {
        oh_noes();
    }
}

Однако мне более любопытно, почему эта проверка вообще имеет значение.

0 голосов
/ 21 января 2019

Вы можете сократить код и проверить, является ли первый символ каждой части нулем:

$string = "03,5";
$string_arr = explode(",",$string);
if ($string_arr[0][0] === "0" || $string_arr[1][0] === "0") {
    echo "not valid";
} else {
    echo "valid";
}
0 голосов
/ 21 января 2019

Один путь будет с /^([1-9]+),(\d+)/;Регулярное выражение, проверяющее строку, начинается с одной или нескольких ненулевых цифр, после которых следует запятая, затем одна или несколько цифр.

preg_match('/^([1-9]+),(\d+)/', $input_line, $output_array);

. Эти цифры разделяются на две группы иявно избегает начальных нулей.

Это можно увидеть на Regex101 здесь и PHPLiveRegex здесь .

0 голосов
/ 21 января 2019

Вы можете сделать простую проверку, если первый символ 0 (с использованием [0]) или ,0 существует в строке

if ( $string[0] == "0" || strpos($string, ",0") !== false ) {
    // One of them had leading zeros!
}
0 голосов
/ 21 января 2019

Вот один подход с использованием preg_match.Мы можем попробовать сопоставить шаблон:

\b0\d+

\b будет соответствовать либо началу строки, или предшествующему разделителю запятой.

Если мынайти такое совпадение, это означает, что мы нашли одно или несколько чисел в списке CSV (или одно число, если присутствует только одно число), у которого был начальный ноль.

$input = "00005,3";
if (preg_match("/\b0\d+/", $input)) {
    echo "no match";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...