Обработка логического поиска в PHP для PostgreSQL - PullRequest
1 голос
/ 30 июня 2011

Это кажется очевидным вопросом, но пока нигде нет ответа.

Я пытаюсь обработать поисковый запрос, чтобы перейти к полнотекстовому поиску postgresql с правильным форматированием с использованием PHP.Я немного новичок в регулярных выражениях, и я просто не могу понять, с чего начать.

Я хочу взять запрос в формате Something AND ("Some Phrase" OR Some Other Phrase) и преобразовать его в 'Something' & (('Some' & 'Phrase')|('Some' & 'Other' & 'Phrase'))

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

1 Ответ

2 голосов
/ 30 июня 2011

Этот код будет анализировать пример как заданный и возвращать запрошенный вывод. Имейте в виду, что это несколько хрупко: вам может потребоваться проверить формат выражения, чтобы убедиться, что он похож на формат, который вы опубликовали.

$input = 'Something AND ("Some Phrase" OR Some Other Phrase)';

$formatted_output = format_input( $input );

// Convert a query to a format suitable for a Postgres full-text search
function format_input( $input ) {
    $output = '';
    list ( $part1, $part2 ) = explode( 'AND', $input );

    // Remove any unecessary characters and add the first part of the line format
    $output = "'" . str_replace( array( "\"", "'" ), '', trim( $part1 ) ) . "' & (";

    // Get a list of phrases in the query
    $phrases = explode( 'OR', str_replace( array( '(', ')'), '', $part2 ) );

    // Format the phrase
    foreach ( $phrases as &$phrase ) {
        $phrase = encapsulate_phrase( trim ( str_replace( array( "\"", "'"), '', $phrase ) ) );
    }

    // Add the formatted phrases to the output
    $output .= '(' . implode( ')|(', $phrases ) . ')';

    // Add the closing parenthesis
    $output .= ')';

    return $output;
}

// Split a search phrase into words, and encapsulate the words
function encapsulate_phrase( $phrase ) {
    $output = '';
    $words = explode( ' ', trim( $phrase ) );

    // Remove leading and trailing whitespace, and encapsulate words in single quotes
    foreach ( $words as &$word ) {
        $word = "'" . trim( $word ) . "'";
    }

    // Add each word to the output
    $output .= implode (" & ", $words);


    return $output;
}

Вы можете проверить свои входные данные следующим образом:

$desired_output = "'Something' & (('Some' & 'Phrase')|('Some' & 'Other' & 'Phrase'))";

if ( !assert ( $formatted_output == $desired_output ) ) {
    echo "Desired: $desired_output\n";
    echo "Actual:  $formatted_output\n";
}
else {
    echo "Output: $formatted_output\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...