问题描述
|
我正在寻找PHP中的正则表达式,可以为我做以下事情:
我有一个人名字的名字字段。我想允许此人在“名字”字段中实际输入两个名字。每个名称必须以大写字母开头,以字母结尾,并在必要时可以包含单引号或破折号。名称之间可以有一个空格。以下名称是可以接受的:
史蒂文·奥赖利
詹姆斯·迪恩·彼得森
詹姆斯·迪恩·彼得森
詹姆斯·迪恩·彼得森
名字字段中的两个名称不是必需的,但可以使用。这是我一直在使用的正则表达式:
if(!preg_match(\'/^[A-Z][a-z-]+[a-z]+([\\s][A-Z][a-z-]+[a-z])?$/\',$fname))
这使我在该字段中有两个名字,它们以大写字母开头,以小写字母结尾。它还允许我使用破折号(-),但我无法将其包含单引号(\')。假设没有其他字母,则在名称末尾也可以有多个空格。我可以使用trim()函数消除它,所以没什么大不了的,但是如果我可以使用正则表达式使其无效,那将是很棒的。
无论如何,任何人都可以提供允许使用单引号并在不允许的最后一个字母后留任何空格的正则表达式吗?
解决方法
尽管可以进行完整的正则表达式验证,但这种方式对您来说是痛苦的,而对于可怜的用户则很麻烦。例如,您可能会大写字母。我一直喜欢将用户名原样保存在db中的方法,并在输出时以所需的方式对其进行格式化。在您的情况下,它可能看起来像这样:
$name = \'john doe\';
$fullname = htmlspecialchars(trim(explode(\" \",$name),ENT_QUOTES));
$firstName = ucfirst($fullname[0]);
$lastName = ucfirst($fullname[1]);
这只是我该如何处理的一个模糊的想法。
要用正则表达式修剪字符串,这也可能对您有帮助:
//Trim whitespace (including line breaks) at the start and the end of the string
preg_replace(\"\\A\\s+|\\s+\\z\",\"\",$text);
对于您的引号,说您想同时允许单引号或双引号,此引号中的[\'\“]块匹配会在您的正则表达式中添加,以便仅在第二个字母后的任何位置匹配一次,例如
例。
,对于可能遇到此问题的任何人,我都发现了我的问题。正则表达式可以使用,但需要几个其他字符。
if(!preg_match(\'/^[A-Z][a-z-\\\']+[a-z]+([\\s][A-Z][a-z-\\\']+[a-z])?$/\',$fname))
我没有做的一件事是在检查$ fname变量之前将其删除。因此,只需对变量使用stripslashes()函数,然后对此进行检查。要消除额外的空格(如果有),只需使用trim()。很简单。