0

我正在尝试创建一个函数来使用正则表达式验证 PHP 上的名称,我希望名称能够携带无限数量的空格和 ' 和 -,并且在空格后只允许大写字符,但在之后允许大写而不是大写- 和 '.. 总长度应为 50 个字符,名称应以小写字母结尾,注意大写字母是 A 到 Z 加上这些字符:

ÙÒÌÈÀÁÉÍßÓÚÝÂÊÎÔÛÃÑÕÄÅÆŒÇÐØËÏÖÜŸ

小写字母是 a 到 z 加上这些字符:

éçàèàèìòùáéíóúýâêîôûãñõäëïöüÿåæœçðøß

每个单词(在空格、' 或 - 和另一个之间)应计算至少 2 个字符名称也应以大写开头并以小写结尾,并且在单词中(在空格、' 或 - 和另一个之间)没有大写但开始的那个是允许的

可接受的名称示例如下:

Adam Klsld
Adam'odskdl
Adam'Ddlsl
Ùdam-ddkkdk
Addssd-Ddsdsd

我已经尝试了很多,但这是我最后一次尝试,我仍然保留在我的 php 文件中,其他我在不成功尝试的混乱中删除了(使用 mb_ereg 函数匹配,所以这是一个 posix-ere) :

([A-ZÙÒÌÈÀÁÉÍßÓÚÝÂÊÎÔÛÃÑÕÄÅÆŒÇÐØËÏÖÜŸ][a-zéçàèàèìòùáéíóúýâêîôûãñõäëïöüÿåæœçðøß]+){1}((^[\'\-\s])[A-ZÙÒÌÈÀÁÉÍßÓÚÝÂÊÎÔÛÃÑÕÄÅÆŒÇÐØËÏÖÜŸ][a-zéçàèàèìòùáéíóúýâêîôûãñõäëïöüÿåæœçðøß]+)*

(这并不一定意味着这是最好的尝试,但我虽然它可能会有所帮助并让我知道我有多傻)

4

3 回答 3

1

这个正则表达式是否回答了您需要检查的内容?

在此处输入图像描述

(当然,您必须在每个括号内添加奇怪的字符)。

于 2013-05-04T00:25:40.723 回答
1

我不会完全建议您使用它...但我认为这可以满足您的要求吗?

^([A-ZÙÒÌÈÀÁÉÍßÓÚÝÂÊÎÔÛÃÑÕÄÅÆŒÇÐØËÏÖÜŸ][a-zéçàèàèìòùáéíóúýâêîôûãñõäëïöüÿåæœçðøß]+){1}((([\s])[A-ZÙÒÌÈÀÁÉÍßÓÚÝÂÊÎÔÛÃÑÕÄÅÆŒÇÐØËÏÖÜŸ][a-zéçàèàèìòùáéíóúýâêîôûãñõäëïöüÿåæœçðøß]+)|((['\-])([A-ZÙÒÌÈÀÁÉÍßÓÚÝÂÊÎÔÛÃÑÕÄÅÆŒÇÐØËÏÖÜŸ]|[a-zéçàèàèìòùáéíóúýâêîôûãñõäëïöüÿåæœçðøß])[a-zéçàèàèìòùáéíóúýâêîôûãñõäëïöüÿåæœçðøß]+))*$

这里它在一个非代码块中,所以你可以看到它是多么的疯狂......虽然它在这里去掉了一些字符:

^([A-ZÙÒÌÈÀÁÉÍßÓÚÝÂÊÎÔÛÃÑÕÄÅÆŒÇÐØËÏÖÜŸ][a-zéçàèàèìòùáéíóúýâêîôûãñõäëïöüÿåæœçðøß]+){1}((([\s])[A-ZÙÒÌÈÀÁÉÍßÓÚÝÂÊÎÔÛÃÑÕÄÅÆŒÇÐØËÏÖÜŸ][a-zéçàèàèìòùáéíóúýâêîôûãñõäëïöüÿåæœçðøß]+)|((['-])([A-ZÙÒÌÈÀÁÉÍßÓÚÝÂÊÎÔÛÃÑÕÄÅÆŒÇÐØËÏÖÜŸ ]|[a-zéçàèàèìòùáéíóúýâêîôûãñõäëïöüÿåæœçðøß])[a-zéçàèàèìòùáéíóúýâêîôûãñõäëïöüÿåæœçðøß]+))*$

于 2013-05-04T00:27:26.287 回答
0

您可以使用它来避免重音字符问题:

$pattern = "~^[\p{Lu}ß]\p{Ll}*+(?>(?> [\p{Lu}ß]|['-]\p{L})\p{Ll}*+)*$~u";
if(preg_match($pattern, $name)) { ...

或者对于更具体的字符集:

$pattern = "~(?(DEFINE)(?<Up>[A-ZÙÒÌÈÀÁÉÍßÓÚÝÂÊÎÔÛÃÑÕÄÅÆŒÇÐØËÏÖÜŸ]))
             (?(DEFINE)(?<Lo>[a-zéçàèàèìòùáéíóúýâêîôûãñõäëïöüÿåæœçðøß]))
             ^\g<Up>\g<Lo>*+(?>(?>\h\g<Up>|['-]\g<Up>?+\g<Lo>)\g<Lo>*+)*+$~ux";

if (preg_match($pattern, $name, $matches)) { ...

或以更短的方式相同:

$pattern = "~(?(DEFINE)(?<Up>[A-ZÀ-ÖØ-ݟߌ]))
             (?(DEFINE)(?<Lo>[a-zà-öø-ýÿßœ]))
             ^\g<Up>\g<Lo>*+(?>(?>\h\g<Up>|['-]\g<Up>?+\g<Lo>)\g<Lo>*+)*+$~ux";
于 2013-05-04T00:40:33.757 回答