Несколько слов до и после искомого слова

Eugeniy

Новичок
Несколько слов до и после искомого слова

Есть текст в переменной ($text), есть искомое слово ($word).
Мне нужно вывести часть текста, по формату:

[несколько слов до искомого слова] + [искомое слово] + [несколько слов после искомого слова]

Подскажите, пожалуйста, как бы это сделать, на какие функции обратить внимание?
 

young

Новичок
preg_match("/.{20}MY_WORD.{20}/, ...

Либо как-то так:

preg_match("/(?:[A-Za-z]*?\s){1,3}MY_WORD(?:[A-Za-z]*?\s)/, ...
 

Кай

Guest
Строковые функции чаще всего работают быстрее, нежели регулярные выражения, не знаю, правда, как в данном случае.
Будет это приблизительно вот так:
PHP:
$text = 'Это какой-то длинный текст';
$word = 'длинный';
$pos = strpos($text, $word);
$before = substr($text, 0, $pos-1);
$last = substr($text, $pos+strlen($word)+1);
echo "$before + $word + $last"; //Выведет: Это какой-то + длинный + текст
 

Demiurg

Guest
Кай, нам было про несколько слов, а не про все.
 

.des.

Поставил пиво кому надо ;-)
На самом деле Demiurg прав.. лучше это регами не делать. Во первых если неудачно составишь рег.. то получишь БОЛЬШИЕ траблы со скоростью.
К примеру.. работающий правильный рег для данной задачи

Работает быстро, выбирает 5 слов до и после(ну если есть эти пять слов.. иначе выберет сколько может)
preg_match("/(\s*[\S]+\s+){0,5}\w*".$search."\w*(\s*[\S]+\s*){0,5}/i",$str,$m);

Рабочий но НЕПРАВИЛЬНЫЙ рег
preg_match("/(\S+\s*){0,5}".$search."(\S+\s*){0,5}/i",$str,$m);
Работает ОЧЕНЬ медленно.. в принципе понятно.. он каждый раз возвращается к началу строки.

И еще. тебе имено слова или все таки в колличествах символов?
вот еще один быстро работающий рег
preg_match("/\s+[\w\W]{0,80}".$search."[\w\W]{0,80}\s+/i",$str,$m);
выбирает по 80 символов до слова и после него.


2 young а можно спросить.. что делают твои реги?
 

young

Новичок
2 young а можно спросить.. что делают твои реги?
Можно.

Первый, по идее, должен выдавать до и после искомого слова 80 знаков.
Второй, по идее, должен описать идею поиска нескольких слов до и после искомого.
 

Eugeniy

Новичок
Получилось у меня вот так:
PHP:
$pos = strpos($text, $word);
$start = $pos-100;
if ($start<0) {$start=0;}
while($start>0) 
		{
		if($text{$start} == " ") {break;}
			else {$start++;}
		};
$before = substr($text, $start, $pos-$start);

$end = $pos+strlen($word)+101;
if ($end>strlen($text)) {$end=strlen($text);}
while($end>$pos+strlen($word)+1) 
		{
		if($text{$end} == " ") {break;}
			else {$end--;}
              };
$last = substr($text, $pos+strlen($word), $end-$pos+strlen($word)+1);
1
echo $before . "<b>" . $word . "</b>" . $last;
Вопрос: Как вот это $pos = strpos($text, $word); сделать регистронезависимым? :confused:
 

Demiurg

Guest
если тексты не слишком большие, то strtolower.
 

Eugeniy

Новичок
у меня почему-то второй цикл, только один раз проходит, хотя условие выполняется...
 

tony.m

Guest
а если прикол в том, что парочка искомых слов находится в нескольких словах друг от друга.
как быть, если надо вывести 1)слова до первого совпадения 2) первое совпадение 3) между первым и вторым 4) второе 5) после второго и т.д. ???
________________________________

появилась мысль -
Правильно ли будет разбивать на массив "найденные 5 слов до - СЛОВО1 - 5 слов после". Затем искать совпадение со СЛОВО2, если есть - вычеслять его положение и добавлять соответсвующее количество слов и так, пока не прогребу все слова запроса
???
 

Eugeniy

Новичок
Усложняю: а когда искомые слова находятся рядомом друг с другом?
 
Сверху