【问题标题】:Search for multiple strings in an array with regex使用正则表达式在数组中搜索多个字符串
【发布时间】:2019-07-22 23:22:32
【问题描述】:

输入字段通过 AJAX 连接到 PHP,PHP 连接到返回艺术家和曲目名称结果的 API。将其视为实时搜索功能。然而,API 会发送需要过滤掉的臃肿。

询问: 迈克尔杰克逊比莉让 结果: 迈克尔·杰克逊 - 比莉·简 迈克尔杰克逊 - 流畅的罪犯 各种艺术家 - Billie Jean

结果存储在一个数组中。

如何过滤掉没有包含所有搜索词的结果?在这种情况下,结果 2 和 3。

我尝试使用preg_grep,但它会搜索 1 个字符串。

$q = $_GET['q']; //michael jackson billie jean
$strings = explode(' ', $q);

$tracks = [
  "Michael Jackson - Billie Jean",
  "Michael Jackson - Smooth Criminal",
  "Various artists - Billie Jean"
];

$matches = preg_grep('/' . $strings[0] . '/i', $tracks);

基本的正则表达式适用于第一个字符串。但是,它需要将所有字符串与数组值匹配。 循环遍历 track 数组并对每个项目执行 preg_grep 会将许多重复项添加到新数组中。

【问题讨论】:

    标签: php arrays regex


    【解决方案1】:

    您可以动态地制作一个正则表达式,其中包含每个单词的正前瞻。你可以在这里感受一下正则表达式:https://regex101.com/r/Qwjw3N/1

    在 PHP 中,它看起来像这样:

    $q = "michael jackson billie jean";
    $strings = explode(' ', $q);
    $tracks = [
      "Michael Jackson - Billie Jean",
      "Michael Jackson - Smooth Criminal",
      "Various artists - Billie Jean"
    ];
    
    $regex = '^(?=.*' . implode(')(?=.*', $strings) . ').*$';
    
    $matches = preg_grep('/' .$regex . '/i', $tracks);
    
    var_dump($matches);
    

    【讨论】:

      猜你喜欢
      • 2014-02-08
      • 2019-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-15
      • 2018-10-07
      相关资源
      最近更新 更多