preg_grep输出部分匹配

时间:2017-12-29 08:47:38

标签: php preg-grep

所以我现在正在使用preg_grep来查找包含字符串的行,但是如果一行包含特殊字符,例如“ - 。@”,我只需键入该行内的1个字母,它就会输出为匹配项。行的例子

example@users.com

搜索请求

ex

并输出

example@users.com

但如果搜索请求与“example@users.com”匹配,则只应输出“example@users.com”此问题仅发生在使用特殊字符的行上,例如

如果我在包含

的行上搜索“example”
example123

它会回应

not found

但如果我搜索确切的字符串“example123”

它当然会按照它的假设输出

example123

所以问题似乎在于包含特殊字符的行。

我目前使用的grep是,

    if(trim($query) == ''){
        $file = (preg_grep("/(^\$query*$)/", $file));
    }else{
        $file = (preg_grep("/\b$query\b/i", $file));

1 个答案:

答案 0 :(得分:0)

$in = [
    'example@users.com',
    'example',
    'example123',
    'ex',
    'ex123',
];
$q = 'ex';
$out = preg_grep("/^$q(?:.*[-.@]|$)/", $in);
print_r($out);

<强>解释

^           : begining of line
$q          : the query value
(?:         : start non capture group
    .*      : 0 or more any character
    [-.@]   : a "special character", you could add all you want
  |         : OR
    $       : end of line
)           : end group

<强>输出:

Array
(
    [0] => example@users.com
    [3] => ex
)

编辑,根据评论:

您必须使用preg_replace

$in = [
    'example@users.com',
    'example',
    'example123',
    'ex',
    'ex123',
];
$q = 'ex';
$out = preg_replace("/^($q).*$/", "$1", preg_grep("/^$q(?:.*[.@-]|$)/", $in));
print_r($out);

<强> Ooutput:

Array
(
    [0] => ex
    [3] => ex
)