2013-04-03 39 views
1

我需要允許在名稱只有字母和數字,但字母必須是UTF-8,因爲這將在德語,西班牙語等多國語言preg_replace函數使用UTF-8字母

我的代碼拋出UTF-8字符使用,如何解決它? 由於

$title = 'aj,o!_-z5ąśäżźŠń?56'; 

echo preg_replace('/[^A-z0-9-]/', '_', $title); 

回答

2

首先,

[A-z]是錯誤的。千萬不要在字符類中使用範圍A-z

它同樣是匹配的[A-Za-z]一些特殊字符,其碼點發生Za之間撒謊。如果你真的只想匹配ASCII字母,你可以使用[A-Za-z][A-Z]並設置「不區分大小寫」標誌。

至於你的問題,我認爲這是你在找什麼:

echo preg_replace('/[^\p{L}\d-]/u', '_', $title); 

/u標誌告訴它來治療正則表達式和源字符串作爲UTF-8,它可以讓你在正則表達式中使用像\p{L}這樣的Unicode屬性。 \d只是一種更簡潔的方式來匹配[0-9](ASCII十進制數字)。根據您的需要,您可能需要使用\p{N}(Unicode編號)或\p{Nd}(Unicode十進制數字),但我很肯定\d就足夠了。