'@^([^\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
数据不匹配:
答案 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打败了