具有特殊字符的名称的正则表达式(Unicode)

Kri*_*our 11 javascript php regex character-properties

好的,我现在整天都在阅读有关正则表达式的内容,但仍然不能理解它.我想要做的是验证一个名字,但我在互联网上找到的功能只能使用[a-zA-Z],留下我需要接受的字符.

我基本上需要一个正则表达式来检查名称是否至少有两个单词,并且它不包含数字或特殊字符!"#¤%&/()=...,但是单词可以包含æ,é,Â等字符......

一个被接受的名字的例子是:"JohnElkjærd"或"AndréSvenson"
一个不被接受的名字是:" Hans ","H 4 nn 3 Andersen"或"Martin Henriksen ! "

如果它重要我使用javascript .match()函数客户端,并希望使用PHP的preg_replace()"负面"服务器端.(删除不匹配的字符).

任何帮助将非常感激.

更新:
好的,感谢Alix Axel的回答,我有重要的部分,服务器方面.

但是,正如LightWing的答案提示的页面所示,我无法找到任何关于javascript的unicode支持,所以我最终为客户端提供了半个解决方案,只检查至少两个单词,最少5个字符,如下所示:

if(name.match(/\S+/g).length >= minWords && name.length >= 5) {
  //valid
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是指定shifty的答案中建议的所有unicode字符,这可能最终会像上面的解决方案那样做,但它有点不实用.

Ali*_*xel 29

请尝试以下正则表达式:

^(?:[\p{L}\p{Mn}\p{Pd}\'\x{2019}]+\s[\p{L}\p{Mn}\p{Pd}\'\x{2019}]+\s?)+$
Run Code Online (Sandbox Code Playgroud)

在PHP中,这转换为:

if (preg_match('~^(?:[\p{L}\p{Mn}\p{Pd}\'\x{2019}]+\s[\p{L}\p{Mn}\p{Pd}\'\x{2019}]+\s?)+$~u', $name) > 0)
{
    // valid
}
Run Code Online (Sandbox Code Playgroud)

你应该这样读:

^   # start of subject
    (?:     # match this:
        [           # match a:
            \p{L}       # Unicode letter, or
            \p{Mn}      # Unicode accents, or
            \p{Pd}      # Unicode hyphens, or
            \'          # single quote, or
            \x{2019}    # single quote (alternative)
        ]+              # one or more times
        \s          # any kind of space
        [               #match a:
            \p{L}       # Unicode letter, or
            \p{Mn}      # Unicode accents, or
            \p{Pd}      # Unicode hyphens, or
            \'          # single quote, or
            \x{2019}    # single quote (alternative)
        ]+              # one or more times
        \s?         # any kind of space (0 or more times)
    )+      # one or more times
$   # end of subject
Run Code Online (Sandbox Code Playgroud)

老实说,我不知道如何将其移植到Javascript,我甚至不确定Javascript是否支持Unicode属性,但在PHP PCRE中,这似乎完美无缺地运行@ IDEOne.com:

$names = array
(
    'Alix',
    'André Svenson',
    'H4nn3 Andersen',
    'Hans',
    'John Elkjærd',
    'Kristoffer la Cour',
    'Marco d\'Almeida',
    'Martin Henriksen!',
);

foreach ($names as $name)
{
    echo sprintf('%s is %s' . "\n", $name, (preg_match('~^(?:[\p{L}\p{Mn}\p{Pd}\'\x{2019}]+\s[\p{L}\p{Mn}\p{Pd}\'\x{2019}]+\s?)+$~u', $name) > 0) ? 'valid' : 'invalid');
}
Run Code Online (Sandbox Code Playgroud)

对不起,我对Javascript部分无法帮助你,但可能会有人在这里.


验证:

  • JohnElkjærd
  • 安德烈斯文森
  • Marco d'Almeida
  • Kristoffer la Cour

无效:

  • 汉斯
  • H4nn3 Andersen
  • 马丁亨里克森!

要替换无效字符,虽然我不确定为什么需要这个,但您只需稍微更改一下:

$name = preg_replace('~[^\p{L}\p{Mn}\p{Pd}\'\x{2019}\s]~u', '$1', $name);
Run Code Online (Sandbox Code Playgroud)

例子:

  • H4nn3 Andersen - > Hnn Andersen
  • 马丁亨里克森!- > Martin Henriksen

请注意,您始终需要使用u修饰符.


Jac*_*esB 5

关于JavaScript则比较棘手,因为JavaScript Regex语法不支持Unicode字符属性。务实的解决方案是匹配以下字母:

[a-zA-Z\xC0-\uFFFF]
Run Code Online (Sandbox Code Playgroud)

这允许使用所有语言的字母,并排除数字和键盘上常见的所有特殊(非字母)字符。这是不完善的,因为它还允许使用非字母的unicode特殊符号,例如表情符号,雪人等。但是,由于这些符号通常在键盘上不可用,因此我认为不会偶然输入它们。因此,根据您的要求,它可能是可接受的解决方案。