簡體   English   中英

警告:preg_split()[function.preg-split]:編譯失敗:字符類中的范圍亂序

[英]Warning: preg_split() [function.preg-split]: Compilation failed: range out of order in character class

我試圖通過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]:編譯失敗:在865行的/home/masqueci/public_html/wp-content/themes/Flatnews/functions.php中偏移3處的字符類中的范圍亂序(bool(假)

該錯誤是由於aZ (小寫+大寫)引起的。 將其更改為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如果設置了此標志,則將捕獲並返回分隔符模式中的帶括號的表達式。

[aZ]並不意味着什么,如果你想要大寫和小寫字母,兩個解決方案:

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

要么

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

在字符類中-用於在unicode表中定義一系列字符。 由於Z在表中的a之前,因此范圍不存在。

注意:使用[Az]也是假的,因為Za之間還有其他字符而不是字母

這樣做的模式:

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

其中(?=..)是一個先行,意味着“后跟”

1是PREG_SPLIT_NO_EMPTY的快捷方式

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM