【问题标题】:Strange behavior of preg_match for dashes and underscores破折号和下划线的 preg_match 的奇怪行为
【发布时间】:2014-04-30 09:18:06
【问题描述】:

我有以下两种表达方式。两者几乎相同,首先我检查以 3 个破折号结尾的字符串,然后检查以 3 个下划线结尾的字符串

$str="this-is_normal-test---";
$str= preg_match("/[a-zA-z0-9]+(-+)$/",$str,$matches);
print_r($matches);

$str="this-is_normal-test___";
$str= preg_match("/[a-zA-z0-9]+(_+)$/",$str,$matches);
print_r($matches);

这是输出:

Array
(
    [0] => test---
    [1] => ---
)
Array
(
    [0] => test___
    [1] => _
)

问题是,第一个显示所有三个匹配的破折号,第二个显示只有一个下划线匹配。为什么?这种奇怪行为的逻辑/发生了什么?

【问题讨论】:

    标签: php regex preg-match


    【解决方案1】:

    在 US-ASCII(和大多数派生编码)中,[A-z] 范围包括 _ 但不包括 -

    echo implode('', range('A', 'z'));
    
    ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz
    

    我想这是一个错字,你的意思是:

    '/[a-z0-9]+(-+)$/i'
    

    【讨论】:

      【解决方案2】:

      我不完全明白为什么会修复它,但这是因为你有A-z,而不是A-Z,所以:

      $str= preg_match("/[a-zA-Z0-9]+(_+)$/",$str,$matches); //note uppercase Z
      

      我只能假设在确定A-z(小写 Z)之间的所有字符时,它似乎包括下划线,一个字母数字字符。

      【讨论】:

      • a-zA-A0-9 应该是 a-zA-Z0-9
      • 似乎确实有效。也许在大写 A 和小写 z 之间有一个下划线。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      • 2013-10-06
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多