【问题标题】:Counter-intuitive preg_match behavior - what is the cleanest way to match a range of characters?违反直觉的 preg_match 行为 - 匹配一系列字符的最简洁方法是什么?
【发布时间】:2013-09-06 08:21:30
【问题描述】:

我正在寻找匹配一系列字符的方法,并假设以下正则表达式仅匹配 20 到 7E 之间的十六进制代码范围内的字符。不过,它也匹配chr(10)(换行),其实就是下面的打印“通过”:

echo preg_match("/^[\x20-\x7E]*$/", chr(10)) ? 'passed' : 'failed';

知道为什么以及如何匹配该范围吗?

【问题讨论】:

    标签: php regex hex preg-match chr


    【解决方案1】:

    chr(10) 是行尾,所以你应该添加modifierD。

    如果设置了此修饰符,则模式中的美元元字符仅匹配主题字符串的末尾。如果没有这个修饰符,如果美元是换行符,它也会紧接在最后一个字符之前匹配(但不在任何其他换行符之前)。

    //                               v
    echo preg_match("/^[\x20-\x7E]*$/D", chr(10)) ? 'passed' : 'failed';
    //                               ^
    

    【讨论】:

    • ...或使用\A\z 代替^$ 强制锚定在字符串的开头和结尾。
    • @TimPietzcker 尽管如此,M42 是否正确,星号是可选的,并且正则表达式不仅适用于表单提要,而且就像 chr(14) 一样,即使您使用了 \A\z
    • @TimPietzcker,你是对的。最好使用 \A 和 \z 因为模式将独立于 PHP。
    • @Sniffer:不。锚点是为了确保整个字符串匹配,chr(14) 肯定超出了字符类定义的范围。问题是 chr(10)$ 特殊对待,正如 sectus 正确指出的那样。
    • @DmitriZaitsev:在这里阅读anchors,尤其是“以换行符结尾的字符串”部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 2016-09-12
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多