【问题标题】:Warning: preg_split() [function.preg-split]: Compilation failed: range out of order in character class警告:preg_split() [function.preg-split]:编译失败:字符类中的范围乱序
【发布时间】:2013-12-15 21:34:26
【问题描述】:

我正在尝试通过 preg_split 函数将字符串转换为数组。我想得到一个包含 1 个字母和可选数字的数组。例如,如果我有“NH2O3”,我想要这个输出:

[0] => N,
[1] => H2,
[2] => O3

我有这个代码:

$formula = "NH2O3";
$pattern = '/[a-Z]{1}[0-9]?/';
$formula = preg_split($pattern, $formula);

但这检索到一个错误:

警告:preg_split() [function.preg-split]:编译失败:范围 在偏移量 3 处的字符类中出现乱序 /home/masqueci/public_html/wp-content/themes/Flatnews/functions.php 上 第 865 行布尔(假)

【问题讨论】:

    标签: php preg-split


    【解决方案1】:

    错误是由于a-Z(小写+大写)造成的。将其更改为 a-zA-Z 或使用修饰符 i 进行不区分大小写的匹配,例如

    /[a-z]{1}[0-9]?/i
    

    您还需要稍微不同地使用 preg_split 以获得该结果:

    $formula = "NH2O3";
    $pattern = '/([a-z][0-9]?)/i';
    $formula = preg_split($pattern, $formula, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
    

    来自http://php.net/preg_split的详细信息:

    PREG_SPLIT_NO_EMPTY 如果设置了这个标志,只有非空的部分会被 由 preg_split() 返回。

    PREG_SPLIT_DELIM_CAPTURE 如果设置了这个标志,括号内的表达式 分隔符模式中的内容也会被捕获并返回。

    【讨论】:

      【解决方案2】:

      [a-Z]不代表什么,如果要大小写字母,两种解决方案:

      $pattern = '/[a-z][0-9]?/i';
      

      $pattern = '/[a-zA-Z][0-9]?/';
      

      在字符类中- 用于定义unicode table 中的字符范围。由于Z 在表中位于a 之前,因此该范围不存在。

      注意:使用[A-z]也是假的,因为Za之间还有字母以外的其他字符

      这样做的模式:

      $formula = preg_split('/(?=[A-Z][a-z]?\d*)/', 'HgNO3', null, 1);
      

      (?=..) 是一个前瞻,意思是“跟随”

      1 是 PREG_SPLIT_NO_EMPTY 的快捷方式

      【讨论】:

      • 这将修复错误,但仍不会给出所需的结果。
      • 为了可读性,最好使用命名常量而不是它们的 int 值。
      猜你喜欢
      • 2014-11-24
      • 1970-01-01
      • 1970-01-01
      • 2014-11-15
      • 2022-11-22
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      相关资源
      最近更新 更多