当前位置: 首页 > 面试题库 >

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

吴均
2023-03-14
问题内容

好的,我整天都在阅读正则表达式,但仍然不太了解它。我正在尝试做的是验证名称,但是我在互联网上可以找到的html" target="_blank">功能只能使用[a-zA-Z],而我需要接受的字符除外。

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

可接受的名称的示例为:“ JohnElkjærd”或“AndréSvenson”。
不可接受的名称为:“ Hans ”,“ H 4 nn 3 Andersen”或“ Martin Henriksen ”。

如果重要的话,我使用javascript
.match()函数客户端,并希望使用phppreg_replace()唯一“负面”服务器端。(删除不匹配的字符)。

任何帮助将非常感激。

更新:
好的,多亏了Alix Axel的回答,但是正如LightWing答案中的页面所建议的那样,我无法找到有关对javascript的unicode支持的任何信息,因此我最终为客户端提供了一半的解决方案,仅检查了至少两个单词和最少5个字符,如下所示:

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

一种替代方法是按照shifty的答案中的建议指定所有unicode字符,我可能最终会像上面的解决方案那样做类似的事情,但这有点不切实际。


问题答案:

尝试以下正则表达式:

^(?:[\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似乎可以完美地工作

$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部分方面为您提供帮助,但可能有人会在这里帮您。

要替换无效字符,尽管我不确定为什么需要这样做,但您只需要对其稍作更改即可:

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

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



 类似资料:
  • 我试图为密码字段创建一个验证,它只允许字符和 时有什么区别,以及哪些字符来自

  • 问题内容: 我很难提出一个正则表达式,该正则表达式实际上会将某些特殊字符列入黑名单。 我需要使用它来验证输入字段中的数据(在Java Web应用程序中)。我们希望允许用户输入任何数字,字母(我们需要包括带重音的字符,例如法语或德语)和一些特殊字符,例如’-。等等 如何将诸如<>%$等的字符列入黑名单? 问题答案: 我只是将角色列入白名单。 使用正则表达式构建黑名单同样简单,但是你可能需要添加更多字

  • 我需要使用正则表达式验证密码 密码应至少包含四个字符, 至少有一个小写字符, 至少有一个大写字符, 至少一个数字 我有以上正则表达式工作,但它接受任何特殊字符。我怎么能拒绝呢,请指点

  • 问题内容: 我想编写一个简单的正则表达式来检查给定字符串中是否存在任何特殊字符。我的正则表达式可以工作,但是我不知道为什么它还包括所有数字,所以当我输入一些数字时会返回错误。 我的代码: 问题答案: 请不要那样做…… 像这样的小Unicode BABY ANGEL 快要死了!◕◡◕(←这些不是图像)(箭头也不是!) 而且您正在杀死20年的DOS:-)(最后一个笑脸称为WHITE SMILING F

  • Java 或任何开源库中是否有任何方法可以转义(不引用)特殊字符(元字符),以便将其用作正则表达式? 这在动态构建正则表达式时非常方便,而无需手动转义每个单独的字符。 例如,考虑一个简单的正则表达式,如 \d \.,它匹配小数点()的数字,以及以下代码: 毫不奇怪,上述代码产生的输出是: 也就是说,匹配但(它是“动态”构建的)不匹配(相反,它匹配文字字符串)。 那么,有没有一种方法可以自动转义每个

  • 我有一个类似这样的字符串: 但是我得到了一个 你知道我做错了什么吗?