我做了一些研究,但是我没有发现任何与我所需要的完全相关的东西,每当我试图创建这个表达式时,它总是和我所需要的东西有一点不同。
我尝试了一些类似于[AZaz09]{3,8}\-[AZaz09]{3,8}的东西。
我希望有效的结果只允许文本-文本,其中任何一个或文本可以是字母或数字,但唯一允许的符号是-,这是介于两个文本之间。
每个文本必须至少有三个字符长({3,8}?),然后用-分隔。
因此,要使它有效,一些例子可以是:
Text-Text
Abc-123
123-Abc
A2C-def4gk无效的测试可能是:
Ab-3
Abc!-ajr4
a-bc3-25aj
a?c-b%发布于 2016-02-27 17:51:38
您需要使用锚并使用-,以便将字符类中的字符作为范围读取,而不是单个字符。
尝试:
^[A-Za-z0-9]{3,8}-[A-Za-z0-9]{3,8}$演示:https://regex101.com/r/xH3oM8/1
您还可以使用i修饰符和\d元字符简化它。
(?i)^[a-z\d]{3,8}-[a-z\d]{3,8}$发布于 2016-02-27 18:21:30
如果应该允许重音字母,或者在Unicode范围内存在的任何其他字母(比如希腊语或西里尔字母),那么使用u修饰符(用于UTF-8支持)和\pL来匹配Unicode字母( \d表示数字):
$string ="
Mañana-déjà
Text-Text
Abc-123
123-Abc
A2C-def4gk
Ab-3
Abc!-ajr4
a-bc3-25aj
a?c-b%";
$regex='/^[\pL\d]{3,}-[\pL\d]{3,}$/mu';
preg_match_all($regex, $string, $matches);
var_export($matches);输出:
array (
0 =>
array (
0 => 'Mañana-déjà',
1 => 'Text-Text',
2 => 'Abc-123',
3 => '123-Abc',
4 => 'A2C-def4gk',
),
)注意:与\w不同的是,[\pL\d]将不匹配下划线。
发布于 2016-02-27 17:52:46
你可以想出以下几点:
<?php
$string ="
Text-Text
Abc-123
123-Abc
A2C-def4gk
Ab-3
Abc!-ajr4
a-bc3-25aj
a?c-b%";
$regex='~
^\w{3,} # at last three word characters at the beginning of the line
- # a dash
\w{3,}$ # three word characters at the end of the line
~xm'; # multiline and freespacing mode (for this explanation)
# ~xmu for accented characters
preg_match_all($regex, $string, $matches);
print_r($matches);
?>正如@chris85所指出的,\w也将匹配一个下划线。亭可有一个很好的评论(匹配重音字符,也就是说)。为了实现这一点,修饰符。
见regex101.com上的演示和关于ideone.com的完整代码。
https://stackoverflow.com/questions/35673217
复制相似问题