2013-03-03 13 views
6

Chcę utworzyć funkcję wyszukiwania PHP, ale przy użyciu operatorów podobnych do Google. Na przykład:Biblioteka PHP do analizowania operatorów wyszukiwania podobnych do Google?

these words "this phrase" location:"Los Angeles" operator:something 

Ważne jest, że podmioty takie jak lokalizacja: wartości wsparcia ze spacjami w nich (stąd notowań w tym przykładzie), więc nie tylko do rozłamu czy można użyć standardowych tokenów. Wyobrażam sobie, że ktoś w pewnym momencie stworzył bibliotekę do robienia tego, ale nie mogę znaleźć żadnej.

Lub jeśli nie wymaga biblioteki, dobry sposób na zrobienie tego będzie dobry.

To tylko parsowanie szukanego zapytania, którego potrzebuję; tj. z powyższego zapytania dobrze byłoby uzyskać tablicę zawierającą:

[0] => these 
[1] => words 
[2] => "this phrase" 
[3] => location:"Los Angeles" 
[4] => operator:something 

Z tego mogę zbudować funkcję wyszukiwania dla bazy danych.

+0

jak o oddzielnych wejść dla „Location, "operator" itp –

+0

[PHP wybuchnąć ciąg, ale traktują słowa w cudzysłów jako jedno słowo] (http: // stackoverflow. com/questions/2202435/php-explode-the-string-but-treat-words-in-quotes-as-a-word) –

+0

@Dagon wolałbym mieć wszystko w jednym zapytaniu. – Rsaesha

Odpowiedz

12

Można rozpocząć od str_getcsv() i użyć spacji jako ogranicznika, ale konieczne może być ponowne przetworzenie operatora lokalizacji w celu obsługi cytatów w tym konkretnym przypadku.

<?php 
$str = 'these words "this phrase" location:"Los Angeles" operator:something'; 

// preprocess the cases where you have colon separated definitions with quotes 
// i.e. location:"los angeles" 
$str = preg_replace('/(\w+)\:"(\w+)/', '"${1}:${2}', $str); 

$str = str_getcsv($str, ' '); 

var_dump($str); 
?> 

wyjście

array(5) { 
    [0]=> 
    string(5) "these" 
    [1]=> 
    string(5) "words" 
    [2]=> 
    string(11) "this phrase" 
    [3]=> 
    string(20) "location:Los Angeles" 
    [4]=> 
    string(18) "operator:something" 
} 
+0

Hmm, to daje mi następującą tablicę: [0] => te, [1] => słowa, [2] => to wyrażenie, [3] => miejsce: "Los, [4] => Angeles", [5] => operator: coś – Rsaesha

+0

Wskazałem, że potrzebna jest logika preprocesu. Dodałem proste wyrażenie regularne. – Coder1

+0

Awesome! Działa to naprawdę dobrze i właśnie tego szukałem. – Rsaesha

Powiązane problemy