代码之家  ›  专栏  ›  技术社区  ›  Chan

当0-9处于条件时,为什么某些符号会传递正则表达式?

  •  1
  • Chan  · 技术社区  · 7 年前

    我需要用PHP编写一个正则表达式,条件是 A-Z, a-z, 0-9 , : , - , _ ,但字符串末尾不能为 :

    这就是我试过的

    <?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));
    }
    

    结果是

    string(26) "number 0 aaa:bbb-cool is 1"
    string(27) "number 1 aaa:bbb-cool- is 0"
    string(30) "number 2 aaa-22-bbb_cool3 is 1"
    string(27) "number 3 aaa:bbb-cool: is 0"
    string(27) "number 4 aaa_bbb-cool: is 0"
    string(26) "number 5 aaa_bbb-cool is 1"
    string(22) "number 6 bbbb:>dd is 1"
    string(19) "number 7 hihi% is 0"
    string(23) "number 8 大家好 is 0"
    string(24) "number 9 0000000000 is 1"
    string(30) "number 10 11111:2222:3333 is 1"
    string(31) "number 11 11111:2222:3333: is 0"
    string(22) "number 12 DDD@@@1 is 1"
    string(24) "number 13 大家好 is 0"
    
    1. 我知道我并不是真的阻止”:“最终,原因1应该是真的,如何纠正它
    2. 为什么数字6和数字12是真的?
    1 回复  |  直到 7 年前
        1
  •  3
  •   Wiktor Stribiżew    7 年前

    你没有阻止,也没有 匹配 这个 : 用你的模式。匹配 : ,消耗零件应包含 : 烧焦字符串6和12匹配,因为 '/[0-9a-zA-Z]+$/i' 模式只匹配字符串末尾的任意ASCII数字或字母1次或多次,并且不检查前面的任何内容。

    您可以使用修复表达式

    '~^[\w:-]+$(?<!:)~'
    

    请参见 regex demo .

    它匹配:

    • ^ -字符串的开头
    • [\w:-]+ -1个或多个单词字符(此处为ASCII字母、数字或 _ ), : - chars公司
    • $ -字符串结尾(您也可以使用 \z 匹配字符串的最末端,或仅添加 D 在regex分隔符之后 ~ )
    • (?<!:) -如果存在 : 字符位于字符串的右端。