2010-10-08 76 views
0

我正在爲我的網站編寫一個搜索引擎,並且需要使用給定關鍵字和搜索結果列表中的幾個字來提取文本塊。 我以類似的東西結束: PHP如何提取給定字符串的一部分?


/** 
* This function return part of the original text with 
* the searched term and few words around the searched term 
* @param string $text Original text 
* @param string $word Searched term 
* @param int $maxChunks Number of chunks returned 
* @param int $wordsAround Number of words before and after searched term 
*/ 
public static function searchTerm($text, $word=null, $maxChunks=3, $wordsAround=3) { 
     $word = trim($word); 
     if(empty($word)) { 
      return NULL; 
     } 
     $words = explode(' ', $word); // extract single words from searched phrase 
     $text = strip_tags($text); // clean up the text 
     $whack = array(); // chunk buffer 
     $cycle = 0; // successful matches counter 
     foreach($words as $word) { 
      $match = array(); 
      // there are named parameters 'pre', 'term' and 'pos' 
      if(preg_match("/(?P\w+){0,$wordsAround} (?P$word) (?P\w+){0,$wordsAround}/", $text, $match)) { 
       $cycle++; 
       $whack[] = $match['pre'] . ' ' . $word . ' ' . $match['pos']; 
       if($cycle == $maxChunks) break; 
      } 
     } 
     return implode(' | ', $whack); 
    } 
此功能不起作用,但你可以看到基本的想法。任何建議如何提高正則表達式是值得歡迎的!

+0

爲什麼你分裂字符串,如果你想要幾個字? – MatTheCat 2010-10-08 12:08:36

+1

在我看來,整個建築看起來太複雜了。你真的需要在文字邊界處剪下文字嗎?你可以簡單地使用PHP ['substr()'-function](http://php.net/substr)。在正則表達式中使用普通變量也有點問題。看一看['preg_quote()'](http://php.net/preg_quote)或者使用['strpos()'](http://php.net/strpos)。 – jwueller 2010-10-08 12:19:45

+0

在這一行:* if($ cycle == $ maxCycles)continue; *使用變量* $ maxCycles *。我想你實際上想把* $ maxChunks *放在那裏,是嗎? – slosd 2010-10-08 12:58:23

回答

1

永遠,永遠注入用戶內容爲正則表達式的模式,而無需使用preg_quote來淨化輸入:

http://us3.php.net/manual/en/function.preg-quote.php

+0

好的,這是一個建議,但如果常規不起作用,這並不重要。無論如何,我會將preg_quote放入。 – 2010-10-08 12:25:21

+2

您是否想要_optimize_ RegEx或_fix_它? – Oxyrubber 2010-10-08 12:43:53

+0

我不是正則表達式的朋友,所以這是我的第一個想法,但我無法繼續前進,並讓我以正確的方式工作 – 2010-10-08 13:26:26

1

爲什麼在這裏重新發明輪子沒有谷歌擁有最好的搜索引擎我會看他們的appliance

+0

我知道他們擁有它,我喜歡他們擁有它的方式。但我希望用一個輕量級功能來解決問題,而不是整個第三方的搜索引擎。 – 2010-10-08 13:29:33