2010-10-08 4 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

+1

По моему мнению, вся конструкция выглядит слишком сложной. Вам действительно нужно вырезать текст на границах слов? Вы могли бы просто использовать PHPs ['substr()' -function] (http://php.net/substr) в противном случае. Использование простых переменных в регулярных выражениях тоже немного проблематично. Взгляните на ['preg_quote()'] (http://php.net/preg_quote) или используйте ['strpos()'] (http://php.net/strpos). – jwueller

+0

В этой строке: * if ($ cycle == $ maxCycles) continue; * вы используете переменную * $ maxCycles *. Я думаю, вы действительно захотите поставить * $ maxChunks * там, не так ли? – slosd

ответ

1

Никогда, никогда пользовательский контент инъекционные в шаблон регулярного выражения без использования preg_quote дезинфицировать вход:

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

+0

ОК, это одно предложение, но если регулярный не работает, это не критично. Спасибо в любом случае, я поставлю preg_quote. –

+2

Вы пытаетесь _optimize_ RegEx или _fix_ it? – Oxyrubber

+0

Я не являюсь другом регулярных выражений, так что это была моя первая идея, но я не мог двигаться дальше и делать правильный путь. –

1

почему повторно изобрести колесо здесь не Google есть лучший поиск двигатель я бы посмотрел на их appliance

+0

Я знаю, что у меня это есть, и мне нравится, как они есть. Но я надеялся решить проблему с помощью одной облегченной функции, а не с поисковой системы всей третьей стороны. –

Смежные вопросы