PHP正则表达式之重复和量词

今天发现了laravel的一个方法,正则表达式写的“很惊奇”,炸看一眼是不是写错了:

/**
     * Limit the number of words in a string.
     *
     * @param  string  $value
     * @param  int  $words
     * @param  string  $end
     * @return string
     */
    public static function words($value, $words = 100, $end = '...')
    {
        preg_match('/^\s*+(?:\S++\s*+){1,'.$words.'}/u', $value, $matches);

        if (! isset($matches[0]) || static::length($value) === static::length($matches[0])) {
            return $value;
        }

        return rtrim($matches[0]).$end;
    }

经过搜罗和挖掘,发现了真理,快速查看官方文档

量词后面紧跟一个 ”+” 是”占有”性。它会吃掉尽可能多的字符, 并且不关注后面的其他模式,比如 .abc 匹配 ”aabc”, 但是 .+abc 不会匹配, 因为 .*+ 会吃掉整个字符串,从而导致后面剩余的模式得不到匹配。 可以使用占有符 (+) 修饰量词来达到提升速度的目的。

有点不好理解,于是写了代码

$str = 'aabc';
preg_match('/.*+bc/', $str, $m); // []
preg_match('/.*+/', $str, $m); // aabc
preg_match('/a*+bc/', $str, $m); // aabc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值