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

时间:2013-02-09 16:28:26

标签: php regex preg-match

如何仅使用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

1 个答案:

答案 0 :(得分: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