PHP - 如何通过将键与正则表达式匹配来搜索关联数组
PHP - How to search an associative array by matching the key against a regexp
我目前正在编写一个小脚本来转换来自外部源的数据。根据我需要将此数据映射到对我的应用程序有意义的内容的内容。
示例输入可以是:
$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 '';
}
}
这会在执行时引发以下错误:
Warning: preg_grep(): Delimiter must not be alphanumeric or backslash
我做错了什么,如何解决?
在 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
搜索适合一个正则表达式的数组元素。所以,你只是用错了函数。
我目前正在编写一个小脚本来转换来自外部源的数据。根据我需要将此数据映射到对我的应用程序有意义的内容的内容。
示例输入可以是:
$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 '';
}
}
这会在执行时引发以下错误:
Warning: preg_grep(): Delimiter must not be alphanumeric or backslash
我做错了什么,如何解决?
在 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
搜索适合一个正则表达式的数组元素。所以,你只是用错了函数。