假設我有一個字串,例如:
155 44x3/2-12
我怎樣才能拆分它,以便最終結果是:
$numbers = [155, 44, 3, 2, 12];
$operators = [' ', 'x', '/', '-'];
我可以使用正則運算式相當容易地分別獲得一個或另一個,但是有沒有一種好方法可以使用正則運算式獲取數字,然后將“其余部分”放入另一個變數而不為它撰寫顯式的正則運算式?陣列項應按照初始字串正確排序。
或者在這種情況下兩個單獨的正則運算式子句是最好的?例如
preg_match_all($string, "/(\d )/", $numbers);
preg_match_all($string, "/(\D )/", $rest);
uj5u.com熱心網友回復:
您可以preg_match_all在此正則運算式中使用 2 個捕獲組在一次呼叫中執行此操作:
(\d )(\D*)
匹配捕獲組 #1 中的 1 個數字并匹配捕獲組 #2 中的 0 個或更多非數字
正則運算式演示
$s = '155 44x3/2-12';
if (preg_match_all('/(\d )(\D*)/', $s, $m)) {
$numbers = $m[1];
$operators = array_filter($m[2]);
// print arrays
print_r($numbers);
print_r($operators);
}
輸出:
Array
(
[0] => 155
[1] => 44
[2] => 3
[3] => 2
[4] => 12
)
Array
(
[0] =>
[1] => x
[2] => /
[3] => -
)
array_filter 已用于從陣列中過濾掉空元素。
uj5u.com熱心網友回復:
可以肯定的是,使用兩個正則運算式并沒有什么罪,preg_match_all()另一個答案的 the 也可以。另一種方法是將它們捕獲到單個陣列中,然后將其分成兩個。由于我們在談論拆分,所以讓我們使用preg_split()標志PREG_SPLIT_DELIM_CAPTURE。這會產生一個數字陣列,如下所示的示例方程:
Array [
[0] => 155
[1] =>
[2] => 44
[3] => x
[4] => 3
[5] => /
[6] => 2
[7] => -
[8] => 12
]
現在,由于您的等式將以數字開頭,因此可以相當安全地假設您的所有運算子在結果陣列中都有奇數鍵。然后,我們可以% 2 == 0在鍵上用 或用 2 對它們進行零模分隔,從而將奇數和偶數分叉到單獨的陣列中。
$equation = '155 44x3/2-12';
// Use ~\s*(\D)\s*~ if you may have spaces around operators
// Use ~(?<!\D)(\D)~ with lookbehind if you have negative integers
$splits = preg_split('~(\D)~', $equation, -1, PREG_SPLIT_DELIM_CAPTURE);
$bits = [];
array_walk($splits, function($v, $k) use (&$bits) {
$type = $k % 2 == 0 ? 'numbers' : 'operators';
$bits[$type][] = $v;
});
這導致:
array(2) {
["numbers"] · array(5) {
[0] · string(3) "155"
[1] · string(2) "44"
[2] · string(1) "3"
[3] · string(1) "2"
[4] · string(2) "12"
}
["operators"] · array(4) {
[0] · string(1) " "
[1] · string(1) "x"
[2] · string(1) "/"
[3] · string(1) "-"
}
}
請注意,如果您-在其中有符號整數,則將數字與運算子分開的基本正則運算式將失敗。您可以添加一個否定的look-behind,排除運算子前面的減號;然后你的正則運算式會看起來像~(?<!\D)(\D)~。
運算子周圍可能還有空格。在這種情況下,在 operator capture/split-matcher regex: 之外添加可選空格,~\s*(\D)\s*~以便在捕獲 operator 本身時在 split 中丟棄空格。
注意您不能將-帶符號數字的負后視與可選空格結合起來,因為負后視需要是固定長度的。你要么有空格,要么(?<!\D\s)沒有(?<!\D)。這將起作用:~\s*(?<!\D\s)(\D)\s*~for 155 44 x 3 / 2 * -12; 這~\s*(?<!\D)(\D)\s*~用于拆分155 44x3/2*-12。
此外,如果您的方程式使用雙字符運算子,例如 PHP 的**冪運算,您將需要修改正則運算式以匹配。如果你有(括號)和其他符號,那就是另一匹馬了。不過,這種方法應該適用于基礎知識。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/421225.html
標籤:
上一篇:防止密碼在源代碼中顯示
