Что то голову сломал. Нужно вырезать все числа в диапазонах от 45...250 и 450...2500 из строки. Помогите с регулярным выражением. В строке помимо цифр еще может быть и текст.
Вместо возможного, но монструозного регулярного выражения на тему, лучше воспользуйтесь 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
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;
Используй 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);
Ничего лишнего:
<?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);
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Здравствуйте, нужно проверить строку $str1 = 'abc123'; и $str2 = 'abc123ABCАбв-+';