php
  • search
  • 2016-04-12 57 views 1 likes 
    1

    我有一個項目,我需要在純PHP中進行一些基本的布爾搜索。這意味着我有簡單的字符串,我想提供一些簡單的布爾搜索。不涉及數據庫或其他索引引擎,所以請不要參考MySQL布爾搜索或lucene。純PHP基於布爾搜索字符串

    最後,像下面的代碼應打印containsnot found

    $search = 'foo -bar "must have" -"must not have"'; 
    $contentFound = 'This is some foo text you must have.'; 
    $contentNotFound = 'This is some bar text you must have.'; 
    
    if ($this->booleanSearch($contentFound, $search)) { 
        echo 'contains'; 
    } else { 
        echo 'not found'; 
    } 
    if ($this->booleanSearch($contentNotFound, $search)) { 
        echo 'contains'; 
    } else { 
        echo 'not found'; 
    } 
    
    +0

    你的意思是像'strpos '? – st2erw2od

    +0

    不可以。因爲strpos只能查看整個字符串,並且不支持布爾搜索,所以這不起作用。 – Laoneo

    +0

    你是什麼意思'布爾搜索?檢查字符串是否包含'true' /'false'或'1' /'0'? – Justinas

    回答

    2

    對於一個簡單的實現,你可以只拆分標準(考慮引號),然後遍歷每個標準,看是否匹配與否:

    function booleanSearch($content, $search) { 
        $criteria = str_getcsv($search, ' '); 
    
        while ($criteria) { 
         $not = false; 
         $q = array_shift($criteria); 
    
         if (substr($q, 0, 2) === '-"') { 
          $not = true; 
    
          while (substr($q, -1) != '"') { 
           $q .= " " . array_shift($criteria); 
          } 
    
          $q = substr($q, 2, -1); 
         } 
         else if (substr($q, 0, 1) === '-' && strpos($q, ' ') === false) { 
          $not = true; 
          $q = substr($q, 1); 
         } 
    
         $found = strpos($content, $q) !== false; 
    
         if ($found === $not) { 
          return false; 
         } 
        } 
    
        return true; 
    } 
    
    +0

    它的工作原理除搜索熱點'$ search ='foo - '必須有'';',它必須分裂。 – Laoneo

    +0

    是的,的確,「 - 」必須在您的初始示例中不存在,並且在我的代碼中沒有處理。請參閱代碼的更新版本。另外,你應該注意到還有一些其他的邊緣情況(例如:''-word'''),你應該在你的實現中注意(上面的代碼片段應該只是作爲一個起點)。 – Razvan

    +0

    我用過你的腳本作爲出發點。我剛剛添加了評論,因爲我不能接受它作爲答案。 – Laoneo

    相關問題