1

我只是在编写一些分析用户名的代码。到目前为止,我已经编写了代码来检测用户名是否包含任何不好的单词、标点符号、符号、数字或重复字符,但设法让自己在检测异常大写时陷入困境。

到目前为止,我已经采用了一种非常简单的方法或以以下形式执行此操作;如果名称有两个以上的大写字母,我们将拒绝该名称。(我使用了两个,因为有些人的名字是双管的,例如 Anne-marie)。

$capitals = strlen($name) - strlen(preg_replace('/[A-Z]/', '', $name));
    if ($capitals > 2) {
        $hasError = true; 
}

尽管它为我们提供了一个不寻常的大写问题的半生不熟的解决方案。问题是,半生不熟!它仍然允许名称中有许多可能的大写和小写字母模式,但如果它们超过两个字符则不允许。

所以,我在 if 语句中添加了一段额外的代码来检查重复的大写字符,从而使上面的代码现在变成这样:

$capitals = strlen($name) - strlen(preg_replace('/[A-Z]/', '', $name));
    if (preg_match('/[A-Z]{2,}/', $name) || $capitals > 2) {
        $hasError = true; 
}

现在这似乎已经解决了这个问题的 70%。用户现在不能再使用这样的模式。XXxxx, XxXxX, xxxXX, xxx-Xxxx。但是我仍然需要解决一些问题,只要他们使用少于两个字符,并且不将大写字母分组,他们仍然可以创建他们“酷”的名字。因此,如果用户要输入类似 JeSse 样式的名称,它将被接受。

所以我的问题是我将如何处理这个问题的最后一步?我只需要允许用户使用 Jesse、Jesse-James、Jesse James 格式的名字。我如何确保只有他们名字的第一个字母大写,即使他们的名字是双筒的?

你在 python 中看到我会使用 .find() 并且只检测第一个单词的第一个字母并确保它是大写的,直到我们遇到空格或连字符,然后确保空格或连字符后面的下一个字母也是大写吗?但我不知道如何在 PHP 中使用正则表达式来做到这一点。

这是使用正则表达式的正确方法吗?如果是,我将如何处理?还是 PHP 有一个秘密的 .find() 函数,我可以以与 python 类似的方式使用?如果是这样,沿着这条路线走会更合适吗?

抱歉,我讲了这么多细节,似乎很多 numtys 提出了诸如“我有一个正则表达式问题,我需要检测模式”之类的问题,然后期望得到一个对他们有用的答案”。我想提供足够的信息以便将来登陆此页面的人们有用。

非常感谢所有未来的答复。

杰米

PS只是出于兴趣,是否有人也知道如何在PHP中使用非英文字符。我是否需要创建一个我希望检测的字符字符串,或者 php 是否为每个字符(如 html 实体)提供了一个“代码”?

4

1 回答 1

1

您可能可以在一个正则表达式中完成所有操作:

 /^ [A-Z][a-z]+ ( [-\s.] [A-Z][a-z]+ )? $/x

这将允许JesseJesse-JamesJesse.JamesJesse James仅。\s(如果您不想要这些,请删除点和速度。)

如果您想允许第二部分以小写字母开头,或者确保至少两个小写字母相互跟随,请使用以下{2,}代替+

 /^ [A-Z][a-z]{2,} ( [-\s.] [A-Z]? [a-z]{2,} )? $/x
                              ^
                          optional now

\p{Lu}对于大写字母的 unicodeness 使用。对于小写字母
\p{Ll}

 /^ \p{Lu}\p{Ll}+ ( [-\s.] \p{Lu} ? \p{Ll}+ )? $/xu

例如,您可能希望添加另一个可选的允许Jesse-J.-James,因此具有单个字母缩写:

 ([A-Z] [.] [-\s])?

虽然这可能需要在开始和中间部分重复。

于 2013-01-24T01:41:01.913 回答