2009-07-16 29 views
7

Nếu tôi có mô tả như:Có ai có đoạn mã PHP để lấy "câu" đầu tiên trong một chuỗi không?

"Chúng tôi muốn câu hỏi có thể được trả lời, không chỉ thảo luận. Cung cấp chi tiết. Viết rõ ràng và đơn giản."

và tất cả những gì tôi muốn là "Chúng tôi thích các câu hỏi có thể được trả lời, không chỉ thảo luận".

Tôi tìm tôi sẽ tìm kiếm cụm từ thông dụng, như "[.! \?]", Xác định strpos và sau đó làm một chất nền từ chuỗi chính, nhưng tôi tưởng tượng đó là một điều phổ biến để làm, có một đoạn nằm xung quanh.

Cảm ơn!

Trả lời

16

Một biểu hơi tốn kém hơn, tuy nhiên sẽ dễ thích nghi hơn nếu bạn muốn chọn nhiều loại dấu chấm câu như Terminators câu.

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

ký tự Find chấm dứt theo sau là một không gian

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

Cảm ơn vì điều này. Tôi cho rằng tôi có thể chấp nhận chi phí, vì nó sẽ được lưu trữ. – FilmJ

+0

Trên thực tế, chỉ cần nhận ra, điều này là thiếu một mảnh. Bởi vì nó lấy tất cả mọi thứ từ đầu đến cuối, nó sẽ loại bỏ dấu chấm câu thực tế. "." ở cuối biểu thức tìm kiếm bên trong các parens dường như giải quyết. preg_replace ('/([^?!.]*.).*/', '\\ 1', $ str); – FilmJ

+0

Bạn phải nắm lấy mã trước khi tôi sửa đổi :) Nếu bạn nhìn lại đó là những gì tôi đăng. –

6
<?php 
$text = "We prefer questions that can be answered, not just discussed. Provide details. Write clearly and simply."; 
$array = explode('.',$text); 
$text = $array[0]; 
?> 
+0

+1 cho phản hồi này. Cần lưu ý rằng mặc dù điều này sẽ phát nổ trên tất cả. (Nghĩa là ký tự thời gian). Vì vậy, nếu câu có chứa các từ viết tắt như 'tức là' hoặc 'ví dụ:'bạn sẽ gặp rắc rối. Ngoài ra nó là lựa chọn dễ dàng nhất. – mdec

+0

Tuy nhiên, không phải tất cả các câu đều kết thúc bằng "." S. Tôi cần cái gì đó sẽ đối phó với "!" và "?" Tôi cũng chắc chắn, vì vậy nó sẽ phải sử dụng regexp tôi nghĩ. – FilmJ

+0

Bạn có thể chia tách các phần tử của mảng $ bằng '!', '?', V.v. – Jason

0
reset(explode('.', $s, 2)); 
0
current(explode(".",$input)); 
0

tôi có lẽ muốn sử dụng bất kỳ đám đông của chuỗi con/chức năng chuỗi-chia trong PHP (một số đề cập ở đây đã được). Nhưng cũng tìm kiếm "." HOẶC ". \ N" (và có thể ". \ N \ r") thay vì chỉ ".". Chỉ trong trường hợp vì lý do gì, câu có chứa một khoảng thời gian không được theo sau bởi một không gian. Tôi nghĩ rằng nó sẽ làm tăng khả năng bạn nhận được kết quả chính hãng.

Ví dụ, chỉ tìm kiếm "." vào lúc:

"I like stackoverflow.com." 

sẽ giúp bạn có được:

"I like stackoverflow." 

Khi thực sự, tôi chắc chắn rằng bạn muốn:

"I like stackoverflow.com." 

Và một khi bạn có mà tìm kiếm cơ bản, bạn sẽ có thể đi qua một hoặc hai lần, nơi nó có thể bỏ lỡ một cái gì đó. Điều chỉnh khi bạn chạy với nó!

+0

Hầu hết các chuỗi có thể sẽ không có dòng mới bên trong chúng. –

+0

Tuy nhiên, tôi nghĩ rằng nhiều chuỗi (và một số trong dự án của tôi) sẽ có URL ... vì vậy sẽ rất tốt để tìm ra giải pháp cho điều đó, mặc dù câu trả lời được chấp nhận ở trên là tốt cho bây giờ. – FilmJ

3

Regex trước đó của tôi dường như hoạt động trong trình kiểm tra nhưng không hoạt động trong PHP thực tế. Tôi đã chỉnh sửa câu trả lời này để cung cấp đầy đủ, làm việc mã PHP, và một regex cải tiến.

$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]); 
} 
+0

Điều này dường như không hoạt động. Bạn đã thay đổi nó kể từ khi bạn đăng lần đầu chưa? – FilmJ

+0

Xin lỗi, viết lại nó và nó hiện đang làm việc mã PHP. – dyve

+0

vì vậy điều này không chỉ làm việc bây giờ, nhưng cuối cùng, nó thực sự xử lý vấn đề thực tế của tôi, trong khi Ian đã không ... (mặc dù lúc đầu nó đã làm). Như tôi đã nhận xét ở trên, có lẽ điều này là do thực tế rằng các kết quả là chuỗi Unicode ... không chắc chắn, nhưng thực phẩm cho tư tưởng. Cảm ơn các chức năng - Tôi sẽ defin. sử dụng nó một lần nữa và một lần nữa. – FilmJ

0

Đây là vấn đề thực sự khó khăn. Tôi khuyên bạn nên xem xét một gói NLP nếu bạn yêu cầu kết quả mạnh mẽ. Một tokenizer có thể xác định các ký tự kết thúc câu (hoặc "?", ".", ";" Vv tùy thuộc vào mục đích sử dụng của bạn), và bạn có thể phân chia trên đó.

2
<?php 

    $content = "My name is Younas. I live on the pakistan. My email is **[email protected]** 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 . '.'; 

    } 

?> 

Output là:

Tên tôi là Younas. Tôi sống trên pakistan.

Các vấn đề liên quan