Как можно выделить наименьшее по длине предложение из строки?

Как можно в пхп выделить из строки
$string = "Первое предложение. Второе предложение. Тр предл.";

Каждое предложение в массив сравнить их по длине и вывести самое короткое или просто обернуть самое короткое в span?
При этом надо учитывать что последнее предложение может не заканчиваться знаком препинания.
  • Вопрос задан
  • 302 просмотра
Решения вопроса 1
miraage
@miraage
Старый прогер
Обновил ответ.

function find_shortest_sentence($text)
{
    $sentences = preg_split('/[.!?]\s*/', $text, -1, PREG_SPLIT_NO_EMPTY);
    
    // передали некорректный текст
    if (!isset($sentences[0])) {
        throw new InvalidArgumentException('Text must contain at least one sentence.');
    }
    
    $min = array_shift($sentences);
    
    foreach ($sentences as $sentence) {
        if (mb_strlen($sentence) < mb_strlen($min)) {
            $min = $sentence;
        }
    }
    
    return $min;
}

var_dump(
    find_shortest_sentence('Первое предложение. Второе предложение. Тр предл.'),
    find_shortest_sentence('Первое предложение. Второе предложение. Тр предл')
);

// string(15) "Тр предл"
// string(15) "Тр предл"
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
Вообще, регулярные выражения не подходят для парсинга естественного языка.
Например, совершенно валидный с точки зрения языка текст
Иван, недавно переехавший в город N. спросил: «Как твои дела?» - и протянул однокласснице букет полевых цветов. Она смутилась и покраснела, но букет приняла. Смеркалось...
вы не разберете на предложения никакой регуляркой (и это я еще из Толстого пример не взял).
Поэтому вам сначала нужно составить формальный набор правил и ограничений, которому должен подчиняться ваш текст и только тогда мы сможем вам помочь составить под этот набор регулярное выражение.
Ответ написан
@vilgeforce
Раздолбай и программист
Вам, в общем-то, даже не нужно сохранять предложения в массив чтобы найти самое короткое. Задача может быть решена и через конечный автомат, когда вы идете по строке и сохраняете символы в буфер, а как только найдете точку - проверяете что строка в буфере короче предыдущей самой короткой из найденных.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы