我试图通过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行布尔(假)
答案 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]
也是假的,因为Z
和a
之间还有其他字符而非$formula = preg_split('/(?=[A-Z][a-z]?\d*)/', 'HgNO3', null, 1);
这样做的模式:
(?=..)
其中{{1}}是预测,意味着“后跟”
1是PREG_SPLIT_NO_EMPTY
的快捷方式