Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Вывод первого предложения


Автор: Guedda 7.9.2010, 13:54
Добрый день, уважаемые. Столкнулся со следующей проблемой. 
Я делаю поиск по базе, и мне возвращается результат. Так вот мне необходимо отфильтровать результат так, чтобы выводилость ТОЛЬКО первое предложение, в котором есть эта поисковая строка.
Например:  
Текст: Мама мыла раму. Рама была холодная, но очень мокрая. Не хочу я, чтобы рама мыла меня.
Поисковой запрос: рама
Результат: Рама была холодная, но очень мокрая.
Как это реализовать? Мозг застопорился, не может найти решение. Может Вы что подскажете?

Заранее благодарен за ответы.

Автор: enoff 7.9.2010, 14:30
Если данные уже взяты из базы, то
Код

$str = "Мама мыла раму. Рама была холодная, но очень мокрая. Не хочу я, чтобы рама мыла меня.";
$search = "рама";
$pattern = "#[^.]*" . $search . "[^.]*\.#ui";
preg_match($pattern, $str, $out);
var_dump($out);

И возможный пробел убрать в начале. Ну или чуть изменить рв.

Автор: CruorVult 7.9.2010, 14:36
+ Кроме точки еще может быть "!" и "?"

Код

$reg = "#[^.?!]*".$search."[^.?!]*#i";

Автор: enoff 7.9.2010, 14:37
Еще добавить другие знаки препинания, которыми заканчивается предложение.

Добавлено через 16 секунд
Не успел...

Автор: enoff 7.9.2010, 14:57
CruorVult, метасимволы в символьном классе не нужно экранировать.

Автор: CruorVult 7.9.2010, 15:08
enoff, буду знать smile 

Автор: ksnk 7.9.2010, 15:45
предложение заканчивается точкой(восклицательным, вопросительным, многоточием) за которым следует пробел. Инициалы терять не хочется...

Автор: enoff 7.9.2010, 19:24
ksnk, между И. О. пробел не ставится?

Автор: ksnk 7.9.2010, 21:48
Хм... вродк как http://www.gramota.ru/spravka/buro/search_answer/?page=7&s=%E8%ED%E8%F6%E8%E0%EB%FB, по правилам инициалы пишутся с разбивкой через пробел, так что все равно потеряются. Хотя можно не считать концом строки слово, состоящее из одной буквы с точкой на конце ;)

Правда сочинить такую регулярку я пока что-то не смог :( 

Автор: enoff 7.9.2010, 22:22
Код

<?php
$str = "Предложение без того, что сейчас нельзя называть." . 
"Это искомое слово, мои инициалы И. А., а дальше текст. ". 
"Следующее предложение искомое слово текст.";
preg_match("#[^.!?]*искомое.*(?<=[^А-Я])[.!?]+#Uu", $str, $out);
var_dump($out);
?>

Только все равно немного не верно, "ААА!" в конце предложения будет считаться инициалом.
Хотя предложение на заглавную букву наврятли будет заканчиваться...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)