[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Массив предложений. Как определять конец предложе?
baston
Есть объемный текст. Нужно каждое предложение текста занести в массив. Использую функцию strtok, в которой определяю конец предложения как точку и как символы переноса строк. Однако, если в предложении содержится несколько переводов строк, или, например, email, то все насмарку.
Может кто подсказать возможный алгоритм решения такой ситуации?
Мой код ниже:
//Исходная строка
$str = "В поле «База данных» необходимо ввести имя базы данных,
в поле «Имя пользователя» ввести имя (логин), которое установлено администратором для конкретного пользователя.
При последующих запусках программы word@net.ru поля «База данных» и «Имя пользователя» будут заполнены.
Более того, пользователь может установить флажки на параметрах
«Сохранять пароль» и «Сохранять имя базы данных».";
$text = array();
//Извлекаем предложения, используя разделители в виде точки и переносов строк
$tok = strtok($str, ".\r\n");
//Заносим каждое предложение в массив (и избавляемся от лишних пробелов)
while($tok)
{
$text[] = trim($tok);
$tok = strtok(".\r\n");
}
echo "<pre>";
print_r($text);
echo "</pre>";

Результат выглядит так, что ни в какие ворота:
user posted image



Спустя 3 минуты, 2 секунды (19.02.2010 - 15:42) DedMorozzz написал(а):
ммм, а использовать "точку пробел". Ибо предложение заканчивается точкой и после ПРОБЕЛ. В мыле не получиться пробелы расставить.
А точнее - "точка-пробел", "точка-спец знак" и "точка-перевод строки"

Спустя 4 минуты, 6 секунд (19.02.2010 - 15:46) baston написал(а):
А как это записать в параметре функции? Разве там допустимо несколько таких аргументов?

Спустя 8 минут, 48 секунд (19.02.2010 - 15:55) DedMorozzz написал(а):
Пока что есть идея находить эти символы и заменять на такие же+какой-то уникальный символ. Далее по этому уникальному символу експлойдить и заносить в массив. Работать такое будет точно, но как-то дико по-индусски это... Мб что то получе придумаю)

Спустя 3 минуты, 38 секунд (19.02.2010 - 15:59) baston написал(а):
Да, переносы можно заменить так:
$str = str_replace("\r\n", "", $str);

А вот с точкой как быть....

Спустя 5 минут, 47 секунд (19.02.2010 - 16:05) DedMorozzz написал(а):
не-не-не...не понял меня) Смотри какова идея. Есть текст "«Сохранять пароль» и «Сохранять имя базы данных»."; "
Тут вполне логично, что конец предложения после .";
итого заменяем эти символы на : (.";ћ) , где ћ - спец символ.
Далее делаем експлойд текста по символам "ћ". И все элементы - будет то, что искали. Только проверку смому настроить надо будет. Что бы и точка-кавычка, точка-пробел, точка-кавычка-точка с запятой туда попали...
Таким образом в Массиве будет текст по предложениям и вообще(!) без изменений оригинала.

Спустя 4 минуты, 6 секунд (19.02.2010 - 16:09) baston написал(а):
Цитата (DedMorozzz @ 19.02.2010 - 16:05)
Тут вполне логично, что конец предложения после .";
итого заменяем эти символы на : (.";ћ) , где ћ - спец символ.

Буду думать, спасибо.

Спустя 16 минут, 2 секунды (19.02.2010 - 16:25) baston написал(а):
Тут одна сложность: может так случиться, что после точки начнется новое предложение (без пробела)...
А пока я сделал так:
$badchar = array(".\"", ". ");
$str = str_replace("\r\n", "", $str);
$str = str_replace($badchar, "ћ", $str);
$text = explode("ћ", $str);</span>

Но второе предложение слилось с третьим...

P.S. А идея хорошая, сам бы не додумался. Спасибо.
P.P.S. Создам новую тему по принудительной вставке пробела, ибо не соображу.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.