Herkes ilk "cümle" kapma için bir kod PHP pasajı var mı

6 Cevap php

: Ben böyle bir açıklama varsa

"Biz sadece tartışılan değil, cevaplanabilir sorular tercih. Detaylar verin. Açıkça ve sadece yazın."

ve tüm istediğim "Biz sadece tartışılan değil, cevaplanabilir sorular tercih ederim." dir

Ben, "[.! \?]" Gibi bir düzenli ifade için arama strpos belirlemek ve daha sonra ana dizeden bir substr yapacağını anlamaya, ama ben o kadar kimse yalan bir pasajı vardır umuduyla, yapılacak ortak bir şey olduğunu hayal etrafında.

Teşekkürler!

6 Cevap

Eğer cümle sonlandırıcı olarak noktalama birden çok türde seçmek istiyorsanız Biraz daha pahalı ifadesi, ancak daha kolay adapte olacaktır.

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

Ardından bir boşluk sonlandırma karakterleri bul

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

Benim önceki regex gerçek PHP tester ama çalışmak için değil gibiydi. Ben tam, çalışan PHP kodu sağlamak için bu cevabı düzenlenmiş ve geliştirilmiş bir regex var.

$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]);
}
<?php

    $content = "Benim adım Younas olduğunu. Ben Pakistan yaşıyor. 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 . '.'; 

    }

?>

Çıktı:

Benim adım Younas olduğunu. Ben Pakistan yaşıyor.

akımı (explode ($ girdi) ".");

I'd probably use any of the multitudes of substring/string-split functions in PHP (some mentioned here already). But also look for ". " OR ".\n" (and possibly ".\n\r") instead of just ".". Just in case for whatever reason, the sentence contains a period that isn't followed by a space. I think it will harden the likelihood of you getting genuine results.

Örneğin, sadece arıyor "." üzerine:

"I like stackoverflow.com."

Alacak:

"I like stackoverflow."

Ne zaman gerçekten, ben tercih ediyorum eminim:

"I like stackoverflow.com."

Eğer bu temel arama var Ve bir kez, muhtemelen bir şey kaçırabilirsiniz bir ya da iki kez karşı karşıya geleceğiz. Onunla çalıştırmak gibi Dinle!

Bu gerçekten zor bir sorun. Eğer sağlam sonuçlar gerekiyorsa ben bir NLP paketin içine bakarak öneririz. (";" "." "?", Ya vb sizin kullanım amacınıza bağlı olarak) bir tokenizer cümle biten karakterleri belirleyebilir ve bu ayırabilirsiniz.