【问题标题】:How to check real names and surnames - PHP如何检查真实姓名和姓氏 - PHP
【发布时间】:2009-02-17 15:31:18
【问题描述】:

这是我的问题: 我想通过检查用户是否只有字母(任何字母)和 ' 或 - 在 PHP 中来检查用户是否插入了真实姓名和姓氏。 我在这里找到了一个关于如何检查字符串是否只有字母的解决方案(但我不记得链接了):

preg_match('/^[\p{L} ]+$/u',$name)

但我也想承认 ' 和 - 。 (字符集为 UTF8) 谁能帮帮我?

【问题讨论】:

  • 是什么让名字成为真名?
  • 足够真实吗? Mr. Bright Joe Williams Jr. 当然,名字/姓氏是欧洲惯例。

标签: php regex utf-8


【解决方案1】:

有点跑题了,但验证名称到底有什么意义?

这不是为了防止欺诈;如果人们想给你一个假名字,他们可以很容易地输入一串随机字母。

这不是为了防止错误;输入标点符号只是您可能犯的众多错误之一,而且不太可能发生。

不是为了防止代码注入;您应该通过正确编码输出来防止这种情况发生,无论它们包含什么字符。

那么为什么我们都这样做呢?

【讨论】:

  • 我只是检查一下没有数字 0-9,不是空的,太短或太长(对于 db 字段)。
  • 你提供的例子是对的,因为我不希望任何人给出像“Jennifer 8 Lee”、“M@rk And€r$0n”之类的名字......
【解决方案2】:

看起来你只需要修改正则表达式:[\p{L}' -]+

【讨论】:

  • 将其编辑为 [\p{L}' -]+ (空格和破折号交换),否则正如 Gumbo 指出的那样是错误的。顺便提一句。您如何确定名称中只允许使用 '、空格和破折号?
  • 已更正,谢谢。至于你的问题,我不能;这是一种启发式方法,仅取决于应用程序的具体要求(例如,纯粹针对美国的应用程序可能几乎不需要额外的字符支持)。
【解决方案3】:

(国际)名称可以包含许多字符:空格、's、破折号、普通字母、变音符号、重音符号、...

编辑:重点是:如何确保所有字母(所有语言)、破折号、' 和空格都足够?是否没有包含点(“Dr. No”呢?)、冒号或其他字符的名称?

EDIT2:感谢可能来自瑞典的用户“some”(留下评论),我们现在知道有一个瑞典名字“Andreas J:son Friberg”。记住冒号!

【讨论】:

  • 元音和重音都是变音符号;他们修改字母,不会自己出现。例如。 “é”。当它说“字母(任何字母)”时,这个问题正确地考虑了它们。承认:中文名字包含象形文字,而不是字母。
  • \p{L} 接受所有字母字符。任何语言。
  • [\p{L}'- ]+ 对我知道的所有名字都有效,但是你怎么能确定你的正则表达式包含世界上所有名字的所有字符呢?
  • 不常见,但瑞典有些人有冒号,比如“Andreas J:son Friberg”
  • 大部分是-儿子的名字,因为女人通常在结婚时改变她的姓氏。有些人想要多个姓氏,并创造新的组合。上例中的“J:son”是“Johansson”、“Jansson”或其他以字符“J”开头的名称的缩写形式。
【解决方案4】:

根据您要允许的字符集,您只需确保要支持的字符位于正则表达式的“[]”部分内。由于“-”字符在此上下文中具有特殊含义(它创建一个范围),因此它必须是列表中的最后一项。

\p{L} 表示匹配任何具有字母属性的字符。 \w 具有相似的含义,但还包括您可能不想要的“_”字符。

preg_match('/^[A-Za-z \'-]+$/i',$name);

将匹配大多数常用名称,但如果您想支持外来字符集,则需要更多外来正则表达式。

【讨论】:

    【解决方案5】:

    这也应该这样做

    /[\w'-]+/gi
    

    【讨论】:

      【解决方案6】:

      如果 charset 是 UTF-8,那么您有一个问题 - 您如何检查中欧和东欧拉丁字符(变音符号)或西里尔文、中文或日文名称的名称?那将是一个地狱般的正则表达式。

      【讨论】:

        【解决方案7】:

        请注意,您提供的示例并未检查以确保用户同时拥有姓氏和名字,尽管我认为应该是这样。你不应该假设一个人有多个名字。我目前正在开发一个在上下文中处理人名的 PHP 应用程序,如果我发现了什么,那就是你不能做出这样的假设 :) 甚至许多非名人也只有一个名字。

        使用 \p{L} 中的 Unicode 类别是个好主意,因为是的,显然人们的名字中会包含来自其他语言的各种字符。但是,除了 \p{L} 之外,您还必须考虑组合标记 - 即人们添加为额外字符的重音、变音符号等。

        所以,也许在 \p{L} 之后我会立即添加 \p{Mc}

        我最终会得到

        preg_match('/^[\pL\p{Mc} \'-]+$/u', $name)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-19
          相关资源
          最近更新 更多