2017-08-15 153 views
1
preg_match('/^[-A-Za-z0-9\p{Han}]+$/u', $name) 

這將只適用於中文字符,我需要它來檢查所有語言。 有什麼建議嗎?多種語言的PHP preg_match

我試過下面的命令。它適用於某種語言,但並不適用於所有人。

preg_match('/^[-A-Za-z0-9\p{L} ]+$/u', $name) 

編輯

確切的要求是:如果字符串包含任何符號,與_更換;同時允許多語言內容。

+0

你的意思是'\ p {Letter}'? – raina77ow

+0

我已經測試過印地文,中文和日文。它適用於中文和日文,但不適用於印地語 – Cristal

+0

它看起來很適合我,但是您沒有包含變音符號模式。嘗試添加'\ p {M}'。 '/^[ - \ p {N} \ p {L} \ p {M} \ s] + $/u''或 - 避免匹配數字 - ''/^[ - \ p {L} \ p {M} \ S] + $/u''。你能請分享*確切*要求?什麼是*字符*在這裏?字母/數字/變音符號/空間/連字符/撇號?當請求正則表達式問題時,請**更具體。 –

回答

0

確切的要求是:如果字符串中包含任何符號,則用_代替;同時允許多語言內容。

所以,你需要使用preg_replace替換與定義的替換字符串模式的所有非重疊的發生,並與符號匹配的模式是\p{S}。不要忘記u UNICODE修飾符。

preg_replace('~\p{S}~u', '_', $s); 

現在,如果你還計劃與-例外匹配,並且刪除標點字符(POSIX字符類[:punct:]包括標點符號),你可以使用

preg_replace('~(?!-)[[:punct:]]~u', '_', $s); 

regex demo

這裏,(?!-)排除模式會限制匹配任何標點和符號字符迫使正則表達式引擎從匹配排除-更通用[[:punct:]]模式。

如果需要,您可以以這種方式添加更多例外。