Я пишу поисковую систему для своего сайта и вам нужно извлечь фрагменты текста с заданным ключевым словом и несколькими словами для списка результатов поиска. Я закончил что-то вроде этого: 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
По моему мнению, вся конструкция выглядит слишком сложной. Вам действительно нужно вырезать текст на границах слов? Вы могли бы просто использовать PHPs ['substr()' -function] (http://php.net/substr) в противном случае. Использование простых переменных в регулярных выражениях тоже немного проблематично. Взгляните на ['preg_quote()'] (http://php.net/preg_quote) или используйте ['strpos()'] (http://php.net/strpos). – jwueller
В этой строке: * if ($ cycle == $ maxCycles) continue; * вы используете переменную * $ maxCycles *. Я думаю, вы действительно захотите поставить * $ maxChunks * там, не так ли? – slosd