Пакет для преобразования строк расширенного поиска в ассоциативный массив? - PullRequest
0 голосов
/ 04 февраля 2019

Интересно, знает ли кто-нибудь о пакете 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").

1 Ответ

0 голосов
/ 04 февраля 2019

Использование 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
)
...