我正在爲我的網站編寫一個搜索引擎,並且需要使用給定關鍵字和搜索結果列表中的幾個字來提取文本塊。 我以類似的東西結束: 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);
}
此功能不起作用,但你可以看到基本的想法。任何建議如何提高正則表達式是值得歡迎的!
爲什麼你分裂字符串,如果你想要幾個字? – MatTheCat 2010-10-08 12:08:36
在我看來,整個建築看起來太複雜了。你真的需要在文字邊界處剪下文字嗎?你可以簡單地使用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
在這一行:* if($ cycle == $ maxCycles)continue; *使用變量* $ maxCycles *。我想你實際上想把* $ maxChunks *放在那裏,是嗎? – slosd 2010-10-08 12:58:23