2013-05-31 28 views
1

我正在用PHP構建過濾器系統。我需要優先考慮基於關鍵字匹配的文字。過濾器必須識別不同類型的關鍵字。在空間中展現字符串但不在引號中使用空格

其中一種類型是正常字,keyword1 keyword2。無論文本是否在文本中連續出現,它都會過濾包含'keyword1'和'keyword2'的文本。

另一種類型是單詞的精確組合,"keyword1 keyword2"。這將優先考慮具有確切組合「keyword1 keyword2」的文章。

還有其他類型,但它們在這裏不相關。

關鍵字類型可以組合,所以keyword1 "keyword2 keyword3"是有效的,並且將搜索具有「keyword1」和確切組合「keyword2 keyword3」的文章。我可以使用explode(' ', $keywords)來獲取數組中的關鍵字但是,這會與keyword1 "keyword2 keyword3"混淆,因爲引號中的文本也會分開。

所以我需要一個函數來分隔關鍵字,但不會將引號中的文本分開。有沒有一個功能可以做到這一點?如果沒有,是一個正則表達式的路要走嗎?

+0

是的,正則表達式可以做你想做的。你試過什麼了? – MCL

+0

@MCL我可以編寫一個正則表達式,但我想知道是否有內置函數來執行此操作。我不要求你寫正則表達式,不要寫'send-me-teh-codez'; – Keelan

+0

你可以編寫你自己的解析器,或者用正則表達式匹配。 (我不會推薦爆炸) –

回答

5

你可以使用正則表達式:

$string = 'test1 test2 "test3 test4"'; 
preg_match_all('/\"[\s\S]+\")|([\S]+)/ism', $string, $matches); 

print_r($matches); 

或者,你可以嘗試使用str_getcsv()

+5

Upvoted爲'str_getcsv()'建議。 – fullybaked

+0

謝謝!是否有原因(性能?)我會使用正則表達式而不是str_getcsv? – Keelan

+0

不太確定,我還沒有測試過性能,但是你可能會使用'str_getcsv()'獲得更好的長期性能,但我認爲它主要只是首選 –

相關問題