我只是编写了一些分析用户名的代码。到目前为止,我已经编写了代码来检测用户名是否包含任何不良单词,标点符号,符号,数字或重复字符,但设法使自己陷入了检测异常大小写的困境。
到目前为止,我已经采用了一种非常简单的方式或者以这种方式实现这一目标;如果名称有两个以上的大写字母,我们会拒绝该名称。 (我使用了两个,因为有些人有双管名称,例如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()函数我可以用类似于pythons的方式吗?如果确实如此,沿着这条路走下去会更合适吗?
抱歉,我进入了如此多的细节,似乎是很多numptys提出的问题,如“我有一个正则表达式问题,我需要检测模式”,然后期待回答一个对他们有用的答案“。我想提供足够的信息,以便将来登陆此页面的人们有用。
非常感谢所有未来的回复。
杰米
P.S。出于兴趣,是否有人也知道如何在PHP中使用非英语字符。我是否需要创建一个我希望检测的字符串,或者php是否为每个字符(例如html实体)设置了“代码”?
答案 0 :(得分:1)
你可以在一个正则表达式中完成所有这些:
/^ [A-Z][a-z]+ ( [-\s.] [A-Z][a-z]+ )? $/x
仅允许Jesse
或Jesse-James
或Jesse.James
或Jesse James
。 (如果你不想要那些,请删除点和\s
步。)
如果您想允许第二部分以小写字母开头,或者确保至少两个小写字母相互跟随,请使用{2,}
代替+
:
/^ [A-Z][a-z]{2,} ( [-\s.] [A-Z]? [a-z]{2,} )? $/x
^
optional now
对于unicodeness使用\p{Lu}
for uppercase letters
\p{Ll}
代表小写字母:
/^ \p{Lu}\p{Ll}+ ( [-\s.] \p{Lu} ? \p{Ll}+ )? $/xu
您可能希望添加另一个可选项以允许Jesse-J.-James
,例如,使用单个字母缩写:
([A-Z] [.] [-\s])?
虽然可能需要在开始和中间部分重复。