У кого-нибудь есть фрагмент кода PHP для захвата первого "предложения" в строке? - PullRequest
8 голосов
/ 16 июля 2009

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

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

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

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

Спасибо!

Ответы [ 8 ]

19 голосов
/ 16 июля 2009

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

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

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

   $sentence = preg_replace('/(.*?[?!.](?=\s|$)).*/', '\\1', $string);
7 голосов
/ 16 июля 2009
<?php
$text = "We prefer questions that can be answered, not just discussed. Provide details. Write clearly and simply.";
$array = explode('.',$text);
$text = $array[0];
?>
3 голосов
/ 16 июля 2009

Мое предыдущее регулярное выражение, похоже, работало в тестере, но не в реальном PHP. Я отредактировал этот ответ, чтобы предоставить полный работающий код PHP и улучшенное регулярное выражение.

$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]);
}
2 голосов
/ 30 марта 2013
<?php

    $content = "My name is Younas. I live on the pakistan. My email is **fromyounas@gmail.com** and skype name is "**fromyounas**". I loved to work in **IOS development** and website development . ";

    $dot = ".";

    //find first dot position     

    $position = stripos ($content, $dot); 

    //if there's a dot in our soruce text do

    if($position) { 

        //prepare offset

        $offset = $position + 1; 

        //find second dot using offset

        $position2 = stripos ($content, $dot, $offset); 

        $result = substr($content, 0, $position2);

       //add a dot

       echo $result . '.'; 

    }

?>

Вывод:

Меня зовут Юнас. Я живу в Пакистане.

0 голосов
/ 17 июля 2009

Это действительно сложная проблема. Я рекомендую изучить пакет НЛП, если вам требуются надежные результаты. Токенайзер может идентифицировать завершающие символы предложения (либо «?», «.», «;» И т. Д. В зависимости от вашего предполагаемого использования), и вы можете разделить это.

0 голосов
/ 16 июля 2009

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

Пример, поиск только "." на:

"I like stackoverflow.com."

Получит ли ты:

"I like stackoverflow."

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

"I like stackoverflow.com."

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

0 голосов
/ 16 июля 2009
current(explode(".",$input));
0 голосов
/ 16 июля 2009
 reset(explode('.', $s, 2));
...