У кого-либо есть отрывок PHP кода для захвата первого “предложения” в строке?

Если у меня есть описание как:

"Мы предпочитаем вопросы, на которые можно ответить, не просто обсудить. Предоставьте подробную информацию. Запишите ясно и просто".

И все, что я хочу:

"Мы предпочитаем вопросы, на которые можно ответить, не просто обсудить".

Я полагаю, что искал бы регулярное выражение, как" [.! \?]", определяют ремни для правки бритв и затем делают substr от основной строки, но я предполагаю, что это - общая вещь сделать, так надеясь, что у кого-то есть отрывок, лежащий вокруг.

10
задан JakeGould 3 July 2019 в 16:45
поделиться

6 ответов

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

$sentence = preg_replace('/([^?!.]*.).*/', '\\1', $string);

Найдите символы завершения, за которыми следует пробел

$sentence = preg_replace('/(.*?[?!.](?=\s|$)).*/', '\\1', $string);
21
ответ дан 3 December 2019 в 14:18
поделиться
<?php
$text = "We prefer questions that can be answered, not just discussed. Provide details. Write clearly and simply.";
$array = explode('.',$text);
$text = $array[0];
?>
8
ответ дан 3 December 2019 в 14:18
поделиться

My previous regex seemed to work in the tester but not in actual PHP. I have edited this answer to provide full, working PHP code, and an improved regex.

$string = 'A simple test!';
var_dump(get_first_sentence($string));

$string = 'A simple test without a character to end the sentence';
var_dump(get_first_sentence($string));

$string = '... But what about me?';
var_dump(get_first_sentence($string));

$string = 'We at StackOverflow.com prefer prices below US$ 7.50. Really, we do.';
var_dump(get_first_sentence($string));

$string = 'This will probably break after this pause .... or won\'t it?';
var_dump(get_first_sentence($string));

function get_first_sentence($string) {
    $array = preg_split('/(^.*\w+.*[\.\?!][\s])/', $string, -1, PREG_SPLIT_DELIM_CAPTURE);
    // You might want to count() but I chose not to, just add   
    return trim($array[0] . $array[1]);
}
3
ответ дан 3 December 2019 в 14:18
поделиться
current(explode(".",$input));
0
ответ дан 3 December 2019 в 14:18
поделиться

Я бы, вероятно, использовал любую из множества функций подстроки / разделения строк в PHP (некоторые из них уже упоминались здесь). Но также ищите "." OR ". \ N" (и, возможно, ". \ N \ r") вместо просто ".". На всякий случай по какой-либо причине предложение содержит точку без пробела. Я думаю, это повысит вероятность того, что вы получите подлинные результаты.

Пример, поиск просто "." on:

"I like stackoverflow.com."

Вы получите:

"I like stackoverflow."

На самом деле, я уверен, вы бы предпочли:

"I like stackoverflow.com."

И как только у вас будет этот базовый поиск, вы, вероятно, столкнетесь один или два случая, когда он может что-то упустить . Настраивайтесь на бегу!

0
ответ дан 3 December 2019 в 14:18
поделиться

Попробуйте следующее:

reset(explode('.', $s, 2));
0
ответ дан 3 December 2019 в 14:18
поделиться
Другие вопросы по тегам:

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