警告:preg_split()[function.preg-split]:编译失败:字符类中的范围乱序

时间:2013-12-15 21:34:26

标签: php preg-split

我试图通过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 on   865行布尔(假)

2 个答案:

答案 0 :(得分:2)

错误是由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如果设置了此标志,则为括号表达式   在分隔符模式中也将被捕获并返回。

答案 1 :(得分:1)

[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}}是预测,意味着“后跟”

1是PREG_SPLIT_NO_EMPTY

的快捷方式