2017-08-15 173 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:]]模式。

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