使用正则表达式允许最多3个下划线

时间:2011-09-03 19:01:13

标签: php regex

'@^([^\W_]*\s){0,3}[^\W_]*$@'

我需要允许3个下划线。

上述正则表达式匹配:

英文字母数字
3个空格
不允许下划线
不允许使用特殊字符

我希望它匹配:

英文字母数字
最多3个空格 最多允许3个下划线
不允许使用特殊字符

这是我的尝试:

1

'@^([^\W]*_\s){0,3}[^\W]*$@'

2

'@^([^\W]*\s){0,3}([^\W]*_){0,3}[^\W]*$@'

我的两次尝试都不起作用。

我在php中使用正则表达式(preg_match函数)... 没有具体的订单。

if(preg_match('@^([^\W_]*\s){0,3}[^\W_]*$@', $_POST['txt_username_reg']))

数据匹配:

james_arden 20
詹姆斯阿登20 James_arden_20_done

数据不匹配:

你好詹姆斯阿登做了20(理由:4个空格)
what_is_your_name_done(原因:4个下划线)
是testing123? (原因:特殊字符)

3 个答案:

答案 0 :(得分:3)

匹配包含3个或更少下划线的任何字符串:

^[^_]*(_[^_]*){0,3}$

这匹配任何包含3个下划线的字符串:

^[^_]*(_[^_]*){3}$

修改

要支持阿拉伯字母,请尝试以下方法:

'/^[^_]*(_[^_]*){0,3}$/u'

请注意使用u修饰符:

  

(PCRE8)

     

此修饰符打开与Perl不兼容的PCRE的其他功能。模式字符串被视为UTF-8。此修饰符可从Unix上的PHP 4.1.0或更高版本以及win32上的PHP 4.2.3获得。从PHP 4.3.5开始检查模式的UTF-8有效性。

     

- http://php.net/manual/en/reference.pcre.pattern.modifiers.php

答案 1 :(得分:3)

无需使用正则表达式,只需使用substr_count

$lessThan3Underscores = substr_count($input, '_') <= 3;

如果有一些荒谬的理由为什么你必须使用正则表达式(这将更难阅读,因此更难维护),匹配

^[^_]*(_[^_]*){0,3}$

答案 2 :(得分:0)

我只是想为一个不同的方法发布一个单独的答案。

而不是构建一个保持计数的复杂正则表达式,只允许无限多个下划线...然后运行另一个正则表达式并确保最多有3个下划线。可以大大简化更复杂的条件。

PS。被@phihag打败了