2011-11-11 61 views
0

我有一個很長的腳本,涉及到將大量的文本文件分割成單獨的單詞和處理它們。使我的腳本UTF-8兼容?

我小寫一切然後刪除除了字母和空格與所有字符:

$content=preg_replace('/[^a-z\s]/', '', $content); // Remove non-letters 

這然後分解和每個字進入相關聯的陣列與occurances作爲值的號碼的鍵:

$words=array_count_values($content); 

我想將腳本轉換爲能夠使用英語以外的語言。 PHP會對此好嗎?我可以使用UTF-8字符作爲數組鍵嗎?我怎麼preg_replace刪除除了任何語言的信件之外的一切? (所有數字,標點符號和隨機字符仍然需要被刪除。)

+1

您可能不想刪除「除字母之外的所有內容」,因爲在大多數語言中,單詞不僅僅由字母組成(認爲是重音和其他變音符號)。 – Artefacto

+0

我建議你閱讀http://unicode.org/reports/tr29/不幸的是,我認爲PHP只展示了ICU的字形邊界功能,而不是字邊界。 – Artefacto

回答

2

是的,你可以使用UTF-8字符鍵(還有什麼不能在一個PHP數組的一個關鍵?:))。你的正則表達式可能看起來像:

/\pL+/u 

編輯: 對不起,應該是:

/[^\pL\p{Zs}]/u 
+0

'有沒有什麼不能成爲PHP數組中的關鍵?'當然!任何非字符串非int。 –

+0

這裏的標誌是什麼意思? – Alasdair

+0

「U」形允許模式包含Unicode字符,我加以防萬一... – zrvan

0

這應該工作,對於你的問題。

<?php 
$string = "Héllø"; 

echo preg_replace('/[^a-z\s]/i', '', $string) . "\n"; 
echo preg_replace('/[^a-z\W\s]/ui', '', $string) . "\n"; 

$arr = array(
    $string => 5 
); 

print_r($arr); 
?> 

preg_replaceu標誌意味着它是unicode的安全,該i標誌意味着它是不區分大小寫。 \W都是單詞字符。

+0

我已經對文本用strtolower(),這是否意味着我可以刪除我的標誌? – Alasdair

+0

這不起作用,它不會刪除標點符號。 – Alasdair

0

最終,你將無法創建工作realiably所有語言的算法。 Unicode Standard Annex #29提供了一個「默認字邊界規範」(這我不知道會很容易在PHP中實現,因爲字符屬性的用戶態中可用的唯一來源是PCRE; mbstring有這個信息,但不公開的話)但它警告說,算法必須針對特定語言進行定製:

這是不可能提供一套統一的規則能夠解決所有問題跨語言或處理一個給定的語言內的所有模糊的情況。 [...]

對於泰國,老撾,柬埔寨,緬甸,以及不使用通常使用的單詞之間的空格其他腳本,一個良好的執行不應該依賴於默認字邊界規範。 [...]