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

标签 php javascript regex character-properties

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

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

一个被接受的名字的例子是:“John Elkjærd”或“André Svenson”
一个不被接受的名字是:“Hans”,“H4 nn3 安徒生”或“Martin Henriksen!

如果这很重要,我会在客户端使用 javascript .match() 函数,并希望仅在“负”服务器端使用 php 的 preg_replace()。 (删除不匹配的字符)。

如有任何帮助,我们将不胜感激。

更新:
好的,感谢Alix Axel's answer我有重要的部分,服务器端。

但是作为LightWing's answer的页面建议,我无法找到有关 javascript 的 unicode 支持的任何信息,所以我最终为客户端提供了一半的解决方案,只需检查至少两个单词和至少 5 个字符,如下所示:

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

另一种方法是按照 shifty's answer 中的建议指定所有 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 中这个 seems to work flawlessly @ 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 部分,我无法为您提供帮助,但这里可能会有人帮您。


验证:

  • 约翰·埃尔克杰德
  • 安德烈·斯文森
  • 马可·达梅达
  • Kristoffer la Cour

无效:

  • 汉斯
  • H4nn3 安徒生
  • 马丁亨里克森!

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

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

例子:

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

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

关于php - 具有特殊字符的名称的正则表达式 (Unicode),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5963228/

相关文章:

javascript - 从c#中的网页检索ajax/JavaScript返回结果

javascript - Akka.js 测试套件 : compilation error on simple example

regex - 我们可以创建一个正则表达式来匹配这个列表中的每个创始人吗?

php - 使用PHP Simple HTML DOM解析器的奇怪错误

JavaScript 代码导致 &lt;header&gt; 和 <nav> 元素不在浏览器中显示

php - 与支付网关API交互时出现401

c# - 空字符串或 10 位数字的正则表达式

JavaScript 正则表达式返回 false,但正则表达式测试器返回 true

javascript - 将 html2pdf pdf 或 html2canvas 图像发送到电子邮件

PHP $_GET ['id' ] 和安全