Интересно, знает ли кто-нибудь о пакете PHP (или правильном термине для поиска в Google) для использования терминов расширенного поиска и преобразования их в ассоциативный массив.
Пример 1:
$term = 'blue birds country:england'
Будет преобразован во что-то вроде:
[
'country' => 'england'
'other' => 'blue blirds'
]
Пример 2:
$term = 'country:"united kingdom" blue birds month:January'
Будет преобразован во что-то вроде:
[
'country' => 'united kingdom',
'month' => 'January',
'other' => 'blue blirds'
]
Я пытался сделать это с помощью preg_match, но я борюсь с различием между отдельными словами в группе (например, group:word
) и несколько слов в группе внутри двойных кавычек (например, group:"word1 word2 word3"
).
С помощью preg_match_all()
это разбивает строку на различные компоненты.
(\w*?):(".*?"|\w*)|(\w+)
разбивает его на name:"values"/value
а также value
частей. Затем они собираются обратно в вывод с соответствующими частями (проверяя, какая часть регулярного выражения соответствует)
$term = 'blue birds country:england';
$term = 'country:"united kingdom" blue birds month:January';
print_r(splitTerms($term));
function splitTerms ( string $input ) {
$matches = [];
preg_match_all('/(\w*?):(".*?"|\w*)|(\w+)/', $input, $matches);
$out = [];
$other = [];
// Loop over first matching group - (\w*?)
foreach ( $matches[1] as $key => $name ) {
if ( !empty($name) ) {
// If name is present - add in 2nd matching group value - (".*?"|\w*) (without quotes)
$out[$name] = trim($matches[2][$key],'"');
}
else {
// Otherwise use 3rd matching group - (\w+)
$other[] = $matches[3][$key];
}
}
if ( count($other) > 0 ) {
$out['other'] = implode(" ", $other);
}
return $out;
}
Который дает…
массив
(
[country] => united kingdom
[month] => January
[other] => blue birds
)
Других решений пока нет …