2017-04-10 110 views
-3

我想做一個高級搜索頁面,在那裏使用可以使用普通搜索或高級搜索。PHP高級preg或爆炸

pizza @Chicago #312 !IL *606 

這是高級搜索的一個例子,這個搜索將尋找有詞「比薩」就可以了,例如「烤鴨土地」任何飯店的名字。 「@Chicago」將縮小位於芝加哥的過濾搜索餐廳的範圍。 「#312」將搜索餐廳電話,您也可以使用10位電話號碼,例如「#3125436754」。 「!IL」將從伊利諾伊州搜索餐館。 「* 606」將搜索餐廳郵政編碼,您也可以使用5位數的郵政編碼,例如「#60643」。

高級搜索參數爲@爲城市,!爲狀態,*郵政編碼,#電話號碼。

如果不需要,則不必使用所有搜索參數。以下是一些搜索示例:

@Chicago這將搜索餐廳城市芝加哥。

#312654 *60644這將在郵編「60644」內搜索電話號碼爲「312654」的餐廳。

Pasta !NY這將搜索在紐約州內具有詞麪食的餐廳名稱。

*60642這將搜索「60642」郵政編碼內的餐廳。

Pizza Land這是一個沒有參數的普通搜索。

我準備好數據庫了,我可以寫下搜索查詢。問題是我正在使用單個搜索文本輸入。我需要php爆炸或類似的選項的單詞分離。就像我說的那樣,不可能有先行的搜索參數。可以有一個或兩個,三個或四個。

我需要一個php函數從搜索查詢中提取參數。

+0

你的代碼在哪裏? – Gert

+0

你可以使用正則表達式,有你的任何嘗試? '*'將需要被轉義。你可以用通配符來表示「like」。如何確定開始/結束? – chris85

+0

你需要一個功能?爲什麼不寫一個函數? –

回答

0

感謝@ chris85,我並不擅長正則表達式或preg,我做了我需要的功能。

function param($searchVal) 
{ 
    $output = array(); 
    if (strpos($searchVal, "@") !== false) { 
     preg_match('/@[a-zA-Z ]+/', $searchVal, $cityMatch); 
     $output["city"] = ltrim($cityMatch[0], '@'); 
    } 
    if (strpos($searchVal, "!") !== false) { 
     preg_match('/![a-zA-Z]{2}/', $searchVal, $stateMatch); 
     $output["state"] = ltrim($stateMatch[0], '!'); 
    } 
    if (strpos($searchVal, ":") !== false) { 
     preg_match('/:[0-9]+/', $searchVal, $zipMatch); 
     $output["zip"] = ltrim($zipMatch[0], ':'); 
    } 
    if (strpos($searchVal, "#") !== false) { 
     preg_match('/#[0-9]+/', $searchVal, $zipMatch); 
     $output["phone"] = ltrim($zipMatch[0], '#'); 
    } 

    preg_match('/^[a-zA-Z 0-9]+/', $searchVal, $queryMatch); 
    $output["query"] = $queryMatch[0]; 

    return $output; 
}