Найти позицию первого появления любого числа больше определенного числа в строке - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть эта строка: «20 плюс 1000 это не 20000».

И я хочу получить позицию первого числа больше 10000.

Я действительно (идля другой цели) используя этот код первого ответа, чтобы получить позицию первого числа в моей строке:

function firstNumPos($text){
  preg_match('/^\D*(?=\d)/', $text, $m);
  return isset($m[0]) ? strlen($m[0]) : false;
}

Но он не различает размеры чисел, так чтоэта функция может отсутствовать, чтобы получить позицию первого вхождения числа больше 10000?

Любое решение приветствуется, не обязательно с использованием этой функции.

Ответы [ 5 ]

0 голосов
/ 19 февраля 2019

Просто используйте это регулярное выражение

\d\d\d\d\d\d*

, чтобы получить совпадения для всех чисел с 5 цифрами или более.Тогда вы можете просто проверить первое совпадение и вернуть его

function getFirstOccr($srcStr, $places=5)
{
//    $matchStr = '\d{'.$places.'}\d*';
    $matchStr = str_repeat('\d', $places).'\d*';
    preg_match('/'.$matchStr.'/', $srcStr, $matches);

    return isset($matches[0]) ? strpos($srcStr,$matches[0]) : false;
}

$srcStr = "20 plus 1000 is not 20000.";
print getFirstOccr($srcStr,5);

Я считаю, что это должно быть наиболее вычислительно эффективным

0 голосов
/ 19 февраля 2019

Если вы всегда собираетесь использовать 10000, может быть достаточно легко найти первые 5-значные числа, используя \d{5}, а если вы хотите положение символа, то используйте PREG_OFFSET_CAPTURE ...

function firstNumPos($text){
    preg_match('/(\d{5})/', $text, $m, PREG_OFFSET_CAPTURE);
    return isset($m[0]) ? $m[0][1] : false;
}

echo firstNumPos('20 plus 1000 is not 20000.');
0 голосов
/ 19 февраля 2019
function firstNumPos($text, $number){
  preg_match_all('!\d+!', $text, $match);
  foreach ($match[0] as $value) {
      if ($value > $number) {
          return strpos($text, $value);
      }
  }
}

echo firstNumPos('20 plus 1000 is not 20000.', 10000);
0 голосов
/ 19 февраля 2019

Если я не неправильно понял ваш вопрос , вы можете попробовать этот способ без использования каких-либо необычных регулярных выражений. Давайте сделаем это простым способом php,

<?php
function findFirstOccurance($str){
    $arr = explode(' ',$str);
    $counter = 0;
    foreach($arr as $value){
        $counter=$counter+strlen($value);
        if($value > 10000){
            return $counter - 1;
        }
    }
}
$str = "20 plus 1000 is not 20000.";
echo findFirstOccurance($str);
?>

DEMO: https://3v4l.org/NNDZk

0 голосов
/ 19 февраля 2019

Вы можете получить все числа с помощью регулярных выражений, а затем зациклить их и найти первое больше 10000.

function getNumberPosition($text, $min = 10000){
    preg_match_all('!\d+!', $text, $matches);

    foreach ($matches[0] as $match) {
        if ($match >= $min) {
            return strpos($text, $match);
        }
    }
}

echo getNumber('20 plus 1000 is not 20000.');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...