2012-05-08 15 views
10

tôi đã được sử dụngExplode một đoạn văn vào câu trong PHP

explode(".",$mystring) 

để chia một đoạn văn trong một câu. Tuy nhiên điều này không bao gồm các câu đã được kết luận với dấu chấm câu khác nhau như! ? :;

Có cách nào sử dụng mảng làm dấu phân cách thay vì một ký tự đơn không? Alternativly là có một cách gọn gàng của tách bằng cách sử dụng dấu chấm câu?

tôi đã cố gắng

explode(("." || "?" || "!"),$mystring) 

hy vọng nhưng nó đã không làm việc ...

+0

sử dụng biểu thức chính quy để phù hợp với mô hình và lưu trữ các giá trị trong một biến, vượt qua biến như tham số để nổ – sree

+0

Hãy xem http://stackoverflow.com/questions/5032210/php-sentence-boundaries-detection – Boby

Trả lời

6

Bạn có thể làm:

preg_split('/\.|\?|!/',$mystring); 

hoặc (đơn giản):

preg_split('/[.?!]/',$mystring); 
+1

Phương pháp này loại bỏ các điểm dừng đầy đủ, vv khỏi chuỗi cuối cùng. – 472084

0

Sử dụng preg_split và cung cấp cho nó một regex như [\ |. \ ?!] để chia trên

0
$mylist = preg_split("/[\.|\?!:;]/", $mystring); 
0

Bạn không thể có nhiều dấu phân cách để phát nổ. Đó là những gì preg_split(); là dành cho. Nhưng ngay cả sau đó, nó phát nổ tại dấu phân cách, vì vậy bạn sẽ nhận được câu trả về mà không có dấu chấm câu. Bạn có thể mất preg_split một bước xa hơn và cờ nó để trả lại các yếu tố riêng của họ với PREG_SPLIT_DELIM_CAPTURE và sau đó chạy một số vòng lặp để nổ tung câu và sau dấu punctation trong mảng trở lại, hoặc chỉ sử dụng preg_match_all();:

preg_match_all('~.*?[?.!]~s', $string, $sentences); 
1
preg_split('/\s+|[.?!]/',$string); 

Một vấn đề có thể xảy ra nếu có địa chỉ email vì nó có thể chia nhỏ nó thành một dòng mới.

2

Giả sử rằng bạn thực sự muốn dấu punctuations với kết quả cuối cùng, bạn đã thử:

$mystring = str_replace("?","?---",str_replace(".",".---",str_replace("!","!---",$mystring))); 
$tmp = explode("---",$mystring); 

nào sẽ để lại dấu chấm câu của bạn một cách tinh tế.

0

Bạn có thể thử preg_split

$sentences = preg_split("/[\.\?\!,;]+/", $mystring); 

Xin lưu ý đây sẽ loại bỏ các punctuations. Nếu bạn muốn loại bỏ đứng đầu hoặc cuối cũng

$sentences = preg_split("/[\.\?\!,;]+\s+?/", $mystring); 
11

Bạn có thể sử dụng preg_split() kết hợp với một PCRE lookahead condition để phân chia các chuỗi sau mỗi lần xuất hiện của ., ;, :, ?, !, ..trong khi vẫn giữ dấu chấm câu thực tế còn nguyên vẹn:

Code:

$subject = 'abc sdfs. def ghi; this is [email protected]! asdasdasd? abc xyz'; 
// split on whitespace between sentences preceded by a punctuation mark 
$result = preg_split('/(?<=[.?!;:])\s+/', $subject, -1, PREG_SPLIT_NO_EMPTY); 
print_r($result); 

Kết quả:

Array 
(
    [0] => abc sdfs. 
    [1] => def ghi; 
    [2] => this is [email protected]! 
    [3] => asdasdasd? 
    [4] => abc xyz 
)