异常大写检测正则表达式 PHP


unusual capitalization detection regex PHP

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

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

$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-XXxxx.但是我仍然需要解决一些问题,只要他们使用少于两个字符,并且不对大写字母进行分组,他们仍然可以创建看起来"很酷"的名字。因此,如果用户输入一个样式类似于 JeSse 的名称,它将被接受。

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

你看在 Python 中我会使用 .find() 并只检测第一个单词的第一个字母并确保它是大写的,指望直到我们遇到空格或连字符,然后确保空格或连字符后面的下一个字母也是大写的?但是我不知道如何在 PHP 中使用正则表达式执行此操作。

这是使用正则表达式的正确方法吗? 如果是,我将如何去做? 或者 PHP 是否有一个秘密的 .find() 函数,我可以以类似于 Python 的方式使用? 如果是这样,走这条路会更合适吗?

抱歉,我

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

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

杰米

附言只是出于兴趣,有没有人也知道如何在 PHP 中使用非英语字符。我是否需要创建一个我希望检测的字符字符串,或者 php 是否像 html 实体一样为每个字符都有一个"代码"?

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

 /^ [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

对于 unicodeness,请使用大写字母的 'p{Lu}
小写的'p{Ll}

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

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

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

尽管这可能需要在开头和中间部分重复。