В настоящее время я работаю над небольшим скриптом для преобразования данных, поступающих из внешнего источника. В зависимости от содержимого мне нужно сопоставить эти данные с тем, что имеет смысл для моего приложения.
Пример ввода может быть:
$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 (): разделитель не должен быть буквенно-цифровым или обратной косой чертой
Что я делаю не так и как это можно решить?
В 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
ищет элементы массива, которые соответствуют одному регулярному выражению. Итак, вы просто использовали неправильную функцию.
Других решений пока нет …