2011-11-13 53 views
9

Hàm str_word_count() trả về một mảng chứa tất cả các từ trong một chuỗi. Nó hoạt động rất tốt, ngoại trừ khi sử dụng các ký tự đặc biệt. Trong trường hợp này, kịch bản php nhận chuỗi qua chuỗi truy vấn:Hỗ trợ các ký tự đặc biệt với str_word_count()

Khi tôi mở: http://localhost/index.php?q=this%20wórds

header('Content-Type: text/html; charset=utf-8'); 
print_r(str_word_count($_GET['q'],1,'ó')); 

Thay vì trả lại:

[0] this 
[1] wórds 

... nó sẽ trả về:

[0] this 
[1] w 
[2] rds 

Cách chức năng này có thể hỗ trợ các ký tự đặc biệt đó mũ đang được gửi qua chuỗi truy vấn?

Cập nhật - nó làm việc ra tốt bằng cách sử dụng mario 's giải pháp:

function sanitize_words($string) { 
    preg_match_all("/\p{L}[\p{L}\p{Mn}\p{Pd}'\x{2019}]*/u",$string,$matches,PREG_PATTERN_ORDER); 
    return $matches[0]; 
} 

Trả lời

10

Không chắc liệu thông số thứ ba đó có đủ để làm cho str_word_count hoạt động cho các ký hiệu không phải ASCII hay không. Nó có thể chỉ hoạt động với Latin-1 nếu có.

Như thay thế, bạn có thể đếm các từ với tuy nhiên một regex:

$count = preg_match_all('/\pL+/u', $_GET['q'], $matches); 

này làm việc cho UTF-8 ít nhất. Để sao chép hoàn toàn str_word_count, bạn có thể cần [\pL']+ cuối cùng.

+0

Nó cũng hoạt động rất tốt. Điều gì sẽ là sự khác biệt giữa regex 1 và 2? Không thể có được thứ hai để làm việc. – andufo

+2

Điều thứ hai sẽ cho phép những thứ như 'không' được tính là một từ duy nhất. Regex hoàn chỉnh là ''/ [\ pL'] +/u'' tất nhiên. Có một phiên bản khác trong hướng dẫn sử dụng http://de.php.net/manual/en/function.str-word-count.php#85592 mà có lẽ bao gồm tất cả các biến thể đánh máy khác của những gì nên được coi là một từ. – mario

+1

"/ \ p {L} [\ p {L} \ p {Mn} \ p {Pd} '\ x {2019}] */u" --- cảm ơn! – andufo

1

gì về chỉ

print_r(str_word_count($_GET['q'],1)); ? 

Bạn cũng có thể phát nổ ('', $ string) trên string và count ($ array);

+0

sẽ không hoạt động. nếu bạn không thiết lập một danh sách cho phép, thì đó là những gì tôi đang cố gắng đưa vào, sẽ không được trả về như một phần của từ đó. Giải pháp explode() có vẻ tốt, nhưng không bao gồm tất cả các trường hợp. Ví dụ: words.separated by.dots – andufo

+0

Nếu bạn cần dấu chấm làm dấu tách, bạn có thể sử dụng $ result = preg_split ('/ [.] /', $ Subject); Điều đó sẽ sử dụng dấu cách hoặc dấu chấm làm dấu phân cách. – Homer6

+0

vấn đề là tôi không thể phụ thuộc vào đầu vào của người dùng. nếu họ muốn họ có thể thêm các chuỗi như thế này: – andufo

0

để sử dụng ngôn ngữ này Đức:

str_word_count($file, 1, 'ÄäÖöÜüß'); 

cho tất cả các ngôn ngữ khác - chỉ để thay thế các ký tự đặc biệt với bạn (tiếng Pháp, Ba Lan vv ...)

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