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

2023-12-27

好吧,我已经读了一整天有关正则表达式的内容,但仍然没有正确理解它。我想做的是验证名称,但我在互联网上找到的功能仅使用[a-zA-Z],留下我需要接受的字符。

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

可接受的名称示例为:“John Elkjærd”或“André Svenson”
不被接受的名称是:“Hans", "H4nn3安徒生”或“马丁·亨利克森!"

如果重要的话我使用javascript.match()功能客户端并想使用 phppreg_replace()仅“负”服务器端。 (删除不匹配的字符)。

任何帮助将非常感激。

Update:
好的,感谢阿利克斯·阿克塞尔的回答 https://stackoverflow.com/questions/5963228/regex-for-names-with-special-characters/5963425#5963425我已经把重要的部分写下来了,服务器端的部分。

但正如页面来自光翼的回答 https://stackoverflow.com/questions/5963228/regex-for-names-with-special-characters/5963334#5963334建议,我无法找到任何有关 javascript 支持 unicode 的信息,所以我最终为客户端提供了一半的解决方案,只需检查至少两个单词和至少 5 个字符,如下所示:

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

另一种方法是按照中的建议指定所有 unicode 字符斯夫菲的回答 https://stackoverflow.com/questions/5963228/regex-for-names-with-special-characters/5963417#5963417,我最终可能会做类似的事情以及上面的解决方案,但这有点不切实际。


尝试以下正则表达式:

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

在 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
}

你应该这样读:

^   # 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

老实说,我不知道如何将其移植到 Javascript,我什至不确定 Javascript 支持 Unicode 属性,但在 PHP PCRE 中似乎工作完美@ IDEOne.com http://www.ideone.com/eNQPq:

$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');
}

很抱歉,我无法帮助您了解 Javascript 部分,但可能有人会帮您。


验证:

  • 约翰·埃尔克杰德
  • 安德烈·斯文森
  • 马可·达尔梅达
  • 克里斯托弗·拉库尔

无效:

  • Hans
  • H4nn3 安徒生
  • 马丁·亨里克森!

要替换无效字符,虽然我不确定为什么需要这个,但你只需要稍微改变它:

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

例子:

  • H4nn3 安徒生->安徒生
  • 马丁·亨里克森!->马丁·亨利克森

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐