PHP - 如何通过将键与正则表达式匹配来搜索关联数组

时间:2017-06-08 09:28:07

标签: php regex preg-grep

我目前正在开发一个小脚本来转换来自外部源的数据。根据内容,我需要将这些数据映射到对我的应用程序有意义的内容。

示例输入可以是:

$input = 'We need to buy paper towels.'

目前我有以下方法:

// Setup an assoc_array what regexp match should be mapped to which itemId
private $itemIdMap = [ '/paper\stowels/' => '3746473294' ];

// Match the $input ($key) against the $map and return the first match
private function getValueByRegexp($key, $map) {
  $match = preg_grep($key, $map);
  if (count($match) > 0) {
    return $match[0];
  } else {
    return '';
  }
}

这会在执行时引发以下错误:

  

警告:preg_grep():分隔符不能是字母数字或反斜杠

我做错了什么,怎么能解决?

1 个答案:

答案 0 :(得分:2)

preg_grep参数的手动顺序是:

string $pattern , array $input

在您的代码中$match = preg_grep($key, $map); - $key是输入字符串,$map是一种模式。

所以,你的电话是

$match = preg_grep(
    'We need to buy paper towels.', 
    [ '/paper\stowels/' => '3746473294' ] 
);

那么,您是否真的尝试在We need to buy paper towels号中找到字符串3746473294

首先修复可以 - swap'em并将第二个参数强制转换为array

$match = preg_grep($map, array($key));

但是这里出现第二个错误 - $itemIdMap是数组。您不能将数组用作regexp。只能使用标量值(更严格地说 - 字符串)。这会引导您:

$match = preg_grep($map['/paper\stowels/'], $key);

这绝对不是你想要的,对吗?

解决方案

$input = 'We need to buy paper towels.';
$itemIdMap = [
    '/paper\stowels/' => '3746473294',
    '/other\sstuff/' => '234432',
    '/to\sbuy/' => '111222',
];

foreach ($itemIdMap as $k => $v) {
    if (preg_match($k, $input)) {
        echo $v . PHP_EOL;
    }
}

您错误的假设是您认为可以使用preg_grep在单个字符串中找到正则表达式数组中的任何项目,但这不正确。相反,preg_grep搜索适合单个正则表达式的数组元素。所以,你刚才使用了错误的功能。