|
|
|
|
|
для: sim5
(20.02.2010 в 06:07)
| | Вы правы, я просто усложнил себе задачу - привычка такая...
Решение однозначно такое (для обычных предложений, не утяжеленных данными, которые бы привели к некорректному результату):
$text = explode(".", trim($str, "."));
foreach($text as $key => $val)
{
$text[$key] = explode(" ", trim($val));
}
echo "<pre>";
print_r($text);
echo "</pre>";
|
| |
|
|
|
|
|
|
|
для: baston
(19.02.2010 в 23:08)
| | Зада из учебника просит одно, вы же либо эту задачу иначе понимаете, либо решаете уже иную, свою.
В ней же требуется получить из строки три предложения, разбив их в последующем на массив. Заменив !? (кстати, зачем еще и с пробелом?) на точки, вы получите уже не три изначальных элемента массива.
Трудно сказать какую цель вы преследуете, но лучше решать конкретную задачу, не меняя на ходу условий ее, а находить способы ее решения, оптимизируя найденные. Коли вы учитесь, то первое, чему вы должны научиться, это среди набора стамесок уметь найти ту, которая вам необходима. А в РНР набор этих стамесок иногда с излишеством.
Не обязательно рег. выражения, есть еще масса функций работы с массивами. К рег. выражениям возможно придется прибегнуть, если, как вы сказали ранее, в строке будет e-mail, но тогда и суть задачи должна быть иной. | |
|
|
|
|
|
|
|
для: sim5
(19.02.2010 в 17:32)
| | Собственно говоря, получилось почти то же самое, но рабочее:
$badchar = array("! ", "? ");
$str = str_replace("\r\n", "", $str);
$str = str_replace($badchar, ". ", $str);
$text = explode(". ", rtrim($str, "."));
|
Говоря о другом подходе, вы имели в виду регулярные выражения? | |
|
|
|
|
|
|
|
для: sim5
(19.02.2010 в 17:32)
| | Вот елки зеленые, про трим-то я забыл совсем...
Спасибо, тестирую. | |
|
|
|
|
|
|
|
для: baston
(19.02.2010 в 17:27)
| | Прежде чем такое утверждать, прочтите внимательно о функции trim(). Кроме нее есть и другие. И это только один способ, возможен и другой подход. | |
|
|
|
|
|
|
|
для: sim5
(19.02.2010 в 17:06)
| | Вы имеете в виду так:
$text = explode(". ", trim($str));
|
В этом случае под раздачу не попадают предложения с восклицательными знаками, вопросительные. И самое плохое - последнее предложение будет с точкой, в то время как предыдущие - без точки.
Для разбора предложений с такими знаками (!?) можно воспользоваться массивом. А вот как быть с последней точкой (или другим знаком в последнем предложении)? | |
|
|
|
|
|
|
|
для: baston
(19.02.2010 в 17:02)
| | И кто же вам такой чудесный алгоритм подсказал? А не проще ли отрезать точку справа и explode? | |
|
|
|
|
|
|
|
для: baston
(19.02.2010 в 16:04)
| | Решил (подсказали алгоритм) так: ищем вхождения точек как признаки окончания предложения и заменяем их на спецсимвол. Затем уже функцией explode извлекаем наши предложения.
$badchar = array(".\"", ". ", ".\".");
$str = str_replace("\r\n", "", $str);
$str = str_replace($badchar, "ћ", $str);
$text = explode("ћ", $str);
|
| |
|
|
|
|
|
|
|
для: baston
(18.02.2010 в 16:21)
| | Увы... Стоило добавить в предложение email и дополнительные переносы строк, как все решение пошло в разнос :(
Ладно, с переносами я придумал что делать. Избавимся от них заменой:
$str = str_replace("\r\n", "", $str);
|
А вос с точкой как концом предложения - затык... | |
|
|
|
|
|
|
|
для: sim5
(17.02.2010 в 18:23)
| | В итоге получился такой код (ниже). Долго думал, искал как избавится от переноса строк. Нашел, подсказали. Даже узнал, что такое PHP_EOL.
Потом думал, как же сделать двумерный массив - тут предыдущий код товарища и помог (в цикле foreach), сам бы не додумался, точно.
<?php
//Исходная строка
$str = "текст строки с предложениями (см. выше).";
$text = array();
//Извлекаем предложения, используя разделители в виде точки и переносов строк
$tok = strtok($str, ".\r\n");
//Заносим каждое предложение в массив (и избавляемся от лишних пробелов)
while($tok)
{
$text[] = trim($tok);
$tok = strtok(".\r\n");
}
//Каждое слово каждого предожения заносим в массив
foreach($text as $key => $val)
{
$text[$key] = explode(" ", $val);
}
echo "<pre>";
print_r($text);
echo "</pre>";
?>
|
| |
|
|
|
|