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

Posted

技术标签:

【中文标题】PHP - 如何通过将键与正则表达式匹配来搜索关联数组【英文标题】:PHP - How to search an associative array by matching the key against a regexp 【发布时间】:2017-06-08 09:28:06 【问题描述】:

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

样本输入可以是:

$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():分隔符不能是字母数字或反斜杠

我做错了什么,如何解决?

【问题讨论】:

函数是怎么调用的? @u_mulder 不确定您在说什么功能。我只是像这样执行它:$this->getValueByRegexp($input, $itemIdMap); in the same class. 【参考方案1】:

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' ] 
);

那么,您真的尝试在数字3746473294 中查找字符串We need to buy paper towels 吗?

所以首先修复可以 - 交换它们并将第二个参数转换为array

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

但是第二个错误出现了——$itemIdMap 是数组。您不能将数组用作正则表达式。只能使用标量值(更严格地 - 字符串)。这将引导您:

$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 搜索适合单个正则表达式的数组元素。所以,你只是用错了函数。

【讨论】:

不,我需要实现的是使用地图中的键作为正则表达式来匹配输入字符串。所以基本上:遍历 map 的 key=>value 对并使用 key 作为输入的匹配器。 但我没有看到循环。你呢? 因为 preg_grep() 需要一个数组,我想它是在内部处理的。 非常感谢您的意见。按预期工作:thumbsup:

以上是关于PHP - 如何通过将键与正则表达式匹配来搜索关联数组的主要内容,如果未能解决你的问题,请参考以下文章

PHP 正则

php正则表达式

PHP 正则表达式(PCRE)

正则表达式在PHP中搜索多个匹配项

PHP 正则表达式(PCRE)

php 正则表达式匹配类似于字母。又名 u=ü 或 ê=é=è=e