今天发现了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