Regex - исключить "-" между числами - PullRequest
0 голосов
/ 17 мая 2018

В php мне нужно проверить любое количество положительных и / или отрицательных чисел в качестве входных данных от textarea. Числа могут быть плавающими и будут разделяться запятой.

Действительно:

",,,66,,78.8,-89.8,,0.0,,3.14," or "," or "67,89,10,0876,,"

С помощью regex101.com я создал это регулярное выражение

^((-?\d+(\.\d+)?)|(,+))*$

и в php у меня есть этот код

if (preg_match("/^((-?\d+(\.\d+)?)|(,+))*$/", $text))
{
    echo "yes";
} else 
{
    echo "no";
}

И моя проблема в том, что это регулярное выражение также проверяет "-" и дополнительно "." среди чисел.

Это должно быть недействительно:

",,67.8,89.8787,78-89,-8,07,,33.33.33,,,"

Может кто-нибудь помочь как улучшить этот код?

Ответы [ 4 ]

0 голосов
/ 17 мая 2018

Вы можете сделать это без регулярных выражений и с помощью функции is_numeric:

$numbers = array_filter(explode(',', ',,67.8,-89.8787,7889,-8,07,,33.33.33,,,'));
$validate = true;
foreach ($numbers as $number) {
    if (!is_numeric($number)) {
        $validate = false;
        break;
    }
}

var_dump($validate); // false
0 голосов
/ 17 мая 2018

Я бы попробовал что-то подобное:

$my_string = ",,67.8,89.8787,78-89,-8,07,,33.33.33,,,";
$array = explode(",", $my_string);

foreach ($array as $value){
    if (preg_match("[regex_to_create]", $value))
    {
        echo "yes";
    } else 
    {
        echo "no";
    }
}

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

0 голосов
/ 17 мая 2018

Я изменил ваше регулярное выражение на ^(-?\d+(\.\d+)?,?)+$

Теперь он будет проверять строки вроде

"66,78.8,-89.8,0.0,3.14"

, но не

",,,66,,78.8,-89.8,,0.0,,3.14,"

или

"67,89,10,0876,,"

Посмотрите, работает ли это для вашего случая.

Вот тест: https://regex101.com/r/Ivah2H/1

0 голосов
/ 17 мая 2018

Вы можете использовать

/^,*(-?\d*\.?\d+)?(?:,+\g<1>)*,*$/

См. Демоверсию regex .

Подробности

  • ^ - начало строки
  • ,* - 0+ запятых
  • (-?\d*\.?\d+)? - Необязательная группа захвата 1, соответствующая числу с плавающей запятой (примечание: вы можете сохранить оригинал \d+(?:\d+)?, если нехотите сопоставить .8 как поплавки)
  • (?:,+\g<1>)* - 0+ повторений
    • ,+ - 1+ запятых
    • \g<1> - захват группы 1(это вызов подпрограммы , равный (?1) и используемый для повторения первого подшаблона группы захвата)
  • ,* - 0+ запятых
  • $ - конец строки.
...