为什么有些符号在0-9条件下通过正则表达式?

时间:2017-12-28 10:46:17

标签: php regex

我需要在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));
}
  1. 我知道我并没有真正阻止&#34;:&#34;最后,原因1应该是真的,如何使其正确
  2. 为什么6号和12号是真的?

1 个答案:

答案 0 :(得分:3)

你没有阻止,也没有匹配 :你的模式。要匹配:,消费部分应包含:个字符。字符串6和12匹配,因为您的'/[0-9a-zA-Z]+$/i'模式只匹配任何ASCII数字或字母,1或更多次,在字符串的末尾,并且不检查它们之前的任何内容。

您可以使用

修复表达式
'~^[\w:-]+$(?<!:)~'

请参阅regex demo

匹配:

  • ^ - 字符串开头
  • [\w:-]+ - 一个或多个字词字符(此处为ASCII字母,数字或_),:-字符
  • $ - 字符串结尾(您也可以使用\z匹配字符串的最后一端,或者只在正则表达式分隔符D后添加~ < / LI>
  • (?<!:) - 如果在字符串末尾有一个:字符,则会导致匹配失败的负面后瞻。