Как найти ассоциативный массив путем сопоставления ключа с регулярным выражением

В настоящее время я работаю над небольшим скриптом для преобразования данных, поступающих из внешнего источника. В зависимости от содержимого мне нужно сопоставить эти данные с тем, что имеет смысл для моего приложения.

Пример ввода может быть:

$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

Решение

В 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?

Итак, первое исправление может быть — поменяйте местами и приведите второй аргумент 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 ищет элементы массива, которые соответствуют одному регулярному выражению. Итак, вы просто использовали неправильную функцию.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]