2012-11-30 35 views
0

我正在嘗試爲網址創建slu slu。PHP:從字符串中刪除小字,忽略字中的德語字符

我有以下的測試字符串:

$kw='Test-Tes-Te-T-Schönheit-Test'; 

我想刪除小字不到此字符串從三個字符。

所以,我要輸出爲

$kw='test-tes-schönheit-test'; 

我曾嘗試這樣的代碼:

$kw = strtolower($kw); 
$kw = preg_replace("/\b[^-]{1,2}\b/", "-", $kw); 
$kw = preg_replace('/-+/', '-', $kw); 
$kw = trim($kw, '-'); 
echo $kw; 

但結果是:

test-tes-sch-nheit-test 

因此,德國字符ö正在從字符串 中刪除,而德語單詞Schönheit正在被視爲兩個單詞。

請建議如何解決這個問題。

非常感謝。

回答

2

我假設你的字符串不是UTF-8。對於Umlauts/NON-ASCII字符和正則表達式,我認爲,首先將其編碼爲UTF-8,然後 - 在使用u-modifier(unicode)應用正則表達式之後 - 如果需要原始編碼,則再次解碼(根據本地) 。所以,你會開始:

$kw = utf8_encode(strtolower($kw)); 

現在你可以使用正則表達式Unicode的功能。 \ p {L}代表字母,\ p {N}代表數字。如果你認爲所有的字母和數字的字字符(由你),你的邊界將是相反的:

[^\p{L}\p{N}] 

你希望所有文字字符:

[\p{L}\p{N}] 

你需要的單詞,如果有一個開始^或邊界之前。您可以使用正回顧後爲:

(?<=[^\p{L}\p{N}]|^) 

更換之後的邊界或結束最多2「字字符」:

[\p{L}\p{N}]{1,2}([^\p{L}\p{N}]|$) 

所以,你的正則表達式看起來是這樣的:

'/(?<=[^\p{L}\p{N}]|^)[\p{L}\p{N}]{1,2}([^\p{L}\p{N}]|$)/u' 

和解碼到本地,如果你喜歡:

echo utf8_decode($kw); 

祝你好運!羅伯特

1

您的\b單詞界限在ö之間移動,因爲它不是字母數字字符。默認PCRE在ASCII字母上工作。

輸入字符串是UTF-8/Latin-1。治療其他非英文字母的符號,例如,使用/u Unicode modifer

$kw = preg_replace("/\b[^-]{1,2}\b/u", "-", $kw); 

我會用preg_replace_callback/e順便說一句,而是尋找[A-Z]更換。破折號爲strtr,摺疊連續號碼爲[-+]+

+0

嗨馬里奧,你寫道:我會使用preg_replace_callback或/ E順便說一句,而是搜索[A-Z]更換。破折號或只是[ - +] +摺疊連續的。你可以請示範如何?謝謝。 – Arnold