查找比字符串中的某个数字大的任何数字的第一个出现的位置

时间:2019-02-19 15:31:36

标签: php regex

我有这个字符串:“ 20加1000并不是20000。”

我想让第一个数字的位置大于10000。

我实际上(出于不同的目的)使用this第一答案代码来获取字符串中第一个数字的位置:

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

但是它不能区分数字大小,因此,该函数缺少第一个大于10000的数字的位置是什么?

欢迎使用任何解决方案,而不必使用该功能。

5 个答案:

答案 0 :(得分:1)

您可以使用正则表达式获取所有数字,然后对其进行循环查找第一个大于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.');

答案 1 :(得分:1)

<clipPath>

答案 2 :(得分:1)

如果我没有误解您的问题,那么您可以尝试这种方式而无需使用任何花哨的正则表达式,让我们以简单的php方式进行操作,

    <form [formGroup]="dnFormGroup">
    <fieldset>
        <div class="row">
            <section class="col col-6">
                <label class="input">
                <i class="icon-append fa fa-user"></i>
                <input formControlName="displayName" type="text" minlength="3" maxlength="10" placeholder="Display name">
                <b class="tooltip tooltip-top-right"> <i class="fa fa-user txt-color-teal"></i> Please provide a 3 to 10 char name for site display purposes.</b>
                </label>

                <div *ngIf="dnFormGroup.get('displayName').hasError && dnFormGroup.get('displayName').hasError('displayNameTaken')">
                    Display Name is already used
                </div>
            </section>
        </div>
    </fieldset>
</form>

演示: https://3v4l.org/NNDZk

答案 3 :(得分:1)

只需使用此正则表达式

\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);

我认为这应该是计算效率最高的

答案 4 :(得分:0)

如果您始终要使用10000,那么可以很容易地使用\d{5}查找前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.');