用于名称验证的PHP正则表达式

时间:2016-05-28 23:06:14

标签: php regex

所以我有这个任务。 我必须验证一个名称输入,可以包含大小写字母,撇号,空格或逗号。 所以我想出了这个用于验证:

$name = $_POST['your_name'];
$regex_name = '/([A-Z]|[a-z])([A-Z][a-z\s])+/';
if (!preg_match($regex_name, $name)) {
    echo '<span style="color:red">Please input a valid name!</span><br />';
}

但它看起来并不好,我也不知道为什么。

我已经阅读过有关正则表达式和规则的内容,但我不知道我做错了什么。我甚至在stackoverflow上看到了一些例子,但对我来说仍然不清楚。

我认为这应该至少验证字母,但即使对于简单的输入也是错误的,因为错误&#39;。

请帮忙!

3 个答案:

答案 0 :(得分:1)

描述

^[a-zA-Z'\s,]+$

Regular expression visualization

此正则表达式将执行以下操作:

  • 验证给定的字符串只有:
    • 大写字母
    • 小写字母
    • 空间
    • 逗号
    • 撇号

在字符类中,我包括a-zA-Z,在示例中,我启用了不区分大小写的标记。所以这有点多余。

实施例

现场演示

https://regex101.com/r/rM2iU3/2

示例文字

aaaaaaa
bbbb,bbbb
cccc cccc
ddd'ddddd
fff3ffff
gggggggg

样本匹配

aaaaaaa
bbbb,bbbb
cccc cccc
ddd'ddddd
gggggggg

解释

NODE                     EXPLANATION
----------------------------------------------------------------------
  ^                        the beginning of a "line"
----------------------------------------------------------------------
  [a-zA-Z'\s,]+            any character of: 'a' to 'z', 'A' to 'Z',
                           ''', whitespace (\n, \r, \t, \f, and " "),
                           ',' (1 or more times (matching the most
                           amount possible))
----------------------------------------------------------------------
  $                        before an optional \n, and the end of a
                           "line"
----------------------------------------------------------------------

答案 1 :(得分:0)

[a-zA-z,' ]

我选择不使用\ s,因为你只指定了空格,而不是任何空白字符。

这是一个很好的工具,可以动态调试正则表达式。

Rubular

答案 2 :(得分:0)

“不能正常工作”不是一个有用的描述。但我猜你的问题很可能是你没有使用字符串开头(^)和字符串结尾($)来锚定查询。这意味着您只匹配字符串中任何位置的字符子集。

此外,你没有在问题中这么说,但在你的代码中,你似乎只想允许第一个字符的字母。这应该适合你:

$name = $_POST['your_name'];
$regex_name = "/^[a-z][a-z,' ]+$/i";
if (!preg_match($regex_name, $name)) {
    echo '<span style="color:red">Please input a valid name!</span><br />';
}

我还在表达式的末尾使用了i修饰符,使搜索不区分大小写。