Диапазонное регулярное выражение

250
08 сентября 2017, 22:40

Что то голову сломал. Нужно вырезать все числа в диапазонах от 45...250 и 450...2500 из строки. Помогите с регулярным выражением. В строке помимо цифр еще может быть и текст.

Answer 1

Вместо возможного, но монструозного регулярного выражения на тему, лучше воспользуйтесь preg_replace_callback:

$text = "какой 10 то текст 50 и еще текст 2000 тест 2400 и 4000 ещё";
$res = preg_replace_callback("/\d+/", function($match){
  $num = +$match[0];
  if(($num > 45 && $num < 250) || ($num > 450 && $num < 2500)){
    return '';
  }
  return $num; // какой 10 то текст  и еще текст  тест  и 4000 ещё
}, $text);
print $res;

https://repl.it/KoV6/0

Answer 2

45...250

Делим на куски 45..49, 50..99, 100..199, 200..249, 250 и собираем:

4[5-9]|[5-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|250

450...2500

Можно сделать аналогично, но не нужно :)

45...250 и 450...2500

Просто добавим необязательные последние цифры к прошлому выражению:

4[5-9][0-9]?|[5-9][0-9][0-9]?|1[0-9][0-9][0-9]?|2[0-4][0-9][0-9]?|2500?

Нужно вырезать все числа в диапазонах

Чтобы не было ложных срабатываний, надо потребовать, чтобы по краям были не цифры:

(?<!\d)(?:тут-само-выражение)(?!\d)

Итого:

(?<!\d)(?:4[5-9][0-9]?|[5-9][0-9][0-9]?|1[0-9][0-9][0-9]?|2[0-4][0-9][0-9]?|2500?)(?!\d)
Проверка: https://ideone.com/ZihNRV
$text = "";
for ($q=1; $q<3002; ++$q)
  $text .= "$q ${q}0 ${q}1 1$q 1${q}1 ";
$pattern = '/(?<!\\d)(?:4[5-9][0-9]?|[5-9][0-9][0-9]?|1[0-9][0-9][0-9]?|2[0-4][0-9][0-9]?|2500?)(?!\\d)/';
preg_match_all($pattern, $text, $matches);
$vals = $matches[0];
foreach ($vals as $val)
  if ($val < 45 || $val > 250 && $val < 450 || $val > 2500)
    echo $val . " - FAIL\n";
sort($vals);
$found = preg_replace('/(?<!\\d)(\\d+)( \\1)+/', '$1', join(' ', $vals));
$key = '45';
for ($q=46; $q<=250; ++$q)
  $key .= ' ' . $q;
for ($q=450; $q<=2500; ++$q)
  $key .= ' ' . $q;
echo $found === $key ? "All numbers found :)\n" : "Something went wrong!!!\n";
echo $found;
Answer 3

Используй preg_replace_callback http://php.net/manual/ru/function.preg-replace-callback.php

$string = 'test100-bigtest2000ANd###9999999';
function checkNumber($matches)
{
    if($matches[0] >= 45 && $matches[0] <=250) {
        return '';
    }
    if($matches[0] >= 450 && $matches[0] <=2500) {
        return '';
    }
    return $matches[0];
}
echo preg_replace_callback('/\d{2,4}/u', 'checkNumber', $string);
Answer 4

Ничего лишнего:

<?php
$string = 'Нужно вырезать все числа в диапазонах от 45...250 и 450...2500 из строки.';
//Нужно вырезать все числа в диапазонах от ... и ... из строки.
echo preg_replace_callback('~\d{2,4}~', function ($a) {
    return ($a[0]>=45&&$a[0]<=250||$a[0]>=450&&$a[0]<=2500) ? false : $a[0];
}, $string);
READ ALSO
php проверка строки

php проверка строки

Здравствуйте, нужно проверить строку $str1 = 'abc123'; и $str2 = 'abc123ABCАбв-+';

320
Парковка доменов

Парковка доменов

Доброго времени сутокВопрос к знатокам или знакомым с данным вопросом

251
Настройка порта USB (FLOW CONTROL)

Настройка порта USB (FLOW CONTROL)

Помогите настроить порт USB DTR_CONTROL_DISABLE 0x00

318
OpenCV cv::Mat element access

OpenCV cv::Mat element access

Excpected output:

313