我需要在PHP中编写一个正则表达式,条件是A-Z, a-z, 0-9
,:
,-
,_
,但在字符串的末尾不能是{{1 }}
这就是我试过的
:
,结果是
<?php
$strings = [
'aaa:bbb-cool',
'aaa:bbb-cool-',
'aaa-22-bbb_cool3',
'aaa:bbb-cool:',
'aaa_bbb-cool:',
'aaa_bbb-cool',
'bbbb:>dd',
'hihi%',
'大家好',
'0000000000',
'11111:2222:3333',
'11111:2222:3333:',
'DDD@@@1',
'大家好',
];
$pattern = '/[0-9a-zA-Z]+$/i';
foreach ($strings as $key => $string) {
var_dump('number '.$key .' '. $string.' is '.preg_match($pattern, $string));
}
答案 0 :(得分:3)
你没有阻止,也没有匹配 :
你的模式。要匹配:
,消费部分应包含:
个字符。字符串6和12匹配,因为您的'/[0-9a-zA-Z]+$/i'
模式只匹配任何ASCII数字或字母,1或更多次,在字符串的末尾,并且不检查它们之前的任何内容。
您可以使用
修复表达式'~^[\w:-]+$(?<!:)~'
请参阅regex demo。
匹配:
^
- 字符串开头[\w:-]+
- 一个或多个字词字符(此处为ASCII字母,数字或_
),:
或-
字符$
- 字符串结尾(您也可以使用\z
匹配字符串的最后一端,或者只在正则表达式分隔符D
后添加~
< / LI>
(?<!:)
- 如果在字符串末尾有一个:
字符,则会导致匹配失败的负面后瞻。