1

如何仅使用 preg_match 允许单个下划线?

我在下面制作的正则表达式需要双下划线,这不是我想要的......

if(!preg_match('/^[a-z0-9\s\_]+$/', $name))
    {
        $error = true;
        echo '<error elementid="name" message="name - please use alpha-numbers and lowercaps only." />';
    }

例如,

hello world                  ok
hello_world                  ok
hello__world                 not ok
hello_world__again__         not ok
_hello_world_again_          not ok
4

1 回答 1

3

包括_内部[]+允许倍数。您需要将其包围,[]+但不要将其包含在内。整个结构被包围()+以允许它的倍数,但它总是以字母、数字或空格结尾。

/^([a-z0-9\s]+_?[a-z0-9]+[a-z0-9\s]+)+$/i

分解它:

  • 外部()+允许整个结构的倍数
  • [a-z0-9\s]+多个字母、数字、空格(非下划线
  • _?[a-z0-9]+多个字母/数字/空格内的可选单下划线,但后面不跟空格
  • [a-z0-9\s]+结尾有更多字母、数字、空格(不能以下划线结尾)
  • /i不区分大小写(i如果需要区分大小写,请删除)

// Updated to prevent space after underscore
$patt = '/^([a-z0-9\s]+_?[a-z0-9]+[a-z0-9\s]+)+$/i';

echo preg_match($patt, 'hello world');
// 1
echo preg_match($patt, 'hello_world');
// 1
echo preg_match($patt, 'hello_world_');
// 0
echo preg_match($patt, 'hello__world');
// 0
echo preg_match($patt, 'hello_world how_are you');
// 1
echo preg_match($patt, 'hello_world how_are you_');
// 0
echo preg_match($patt, 'hello_world__ how_are you_');
// 0 
echo preg_match($patt, 'hello_world how_ are you');
// 0
于 2013-02-09T16:30:22.213 回答