為不知道如何準確表達這個問題而道歉。可能還有一個更好的標題。我愿意接受建議。
我有以下科目:
(Field1 = 'Value1') and (Field2 = 'Value2')
和
(Field1 = 'Value1') and (Field2 = 'Value2') or (Field3 = 'Value3')
我想以這樣一種方式進行匹配,即我在組中的 () 和組中的每個連詞之間都有每一件事。所以,對于第二個,一些變化
0: Field1 = 'Value1'
1: and
2: Field2 = 'Value2'
3: or
4: Field3 = 'Value3'
好訊息是,我有一個適用于第一個的正則運算式:
\(([A-Za-z0-9\s\'=] )\) (and|or) \(([A-Za-z0-9\s\'=] )\)

uj5u.com熱心網友回復:
您可以preg_match_all在此處使用正則運算式模式(?<=\()(.*?)(?=\))|(?:and|or),如下所示:
$input = "(Field1 = 'Value1') and (Field2 = 'Value2') or (Field3 = 'Value3')";
preg_match_all("/(?<=\()(.*?)(?=\))|(?:and|or)/", $input, $matches);
print_r($matches[0]);
這列印:
Array
(
[0] => Field1 = 'Value1'
[1] => and
[2] => Field2 = 'Value2'
[3] => or
[4] => Field3 = 'Value3'
)
uj5u.com熱心網友回復:
如果您不擔心括號運算式中可能存在分隔詞或括號的邊緣情況,則preg_split()生成所需的平面陣列。
代碼:(演示)
$input = "(Field1 = 'Val and ue1') and (Field2 = 'Valu or e2') or (Field3 = 'Value3')";
var_export(
preg_split(
"~^\(|\)$|\) (and|or) \(~",
$input,
0,
PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE
)
);
輸出:
array (
0 => 'Field1 = \'Val and ue1\'',
1 => 'and',
2 => 'Field2 = \'Valu or e2\'',
3 => 'or',
4 => 'Field3 = \'Value3\'',
)
或者通過預先修剪最外面的括號來簡化模式。(演示)
var_export(preg_split("~\) (and|or) \(~", trim($input, '()'), 0, PREG_SPLIT_DELIM_CAPTURE));
您還可以使用 continue 元字符\G從上一個匹配項的末尾繼續匹配:(演示)這需要88 步,而 Tim 的模式需要 280 步來決議字串。
$input = "(Field1 = 'Val and ue1') and (Field2 = 'Valu or e2') or (Field3 = 'Value3')";
preg_match_all('~(?:^\(|\G(?!^)(?:\) | \())\K(?:(?:and|or)|[^)] )~', $input, $m);
print_r($m[0]);
在提問者接受不提供問題中所述的輸出陣列結構的答案后進行編輯:(Demo)
preg_match_all("~\((\S = '.*?')\) ?(or|and)?~", $input, $m, PREG_SET_ORDER);
print_r($m);
這不會檢查括號運算式是否出現在連詞之后。此外,在迭代匹配時,將需要額外檢查以查看是否[2]宣告了第三組 ( )。
Array
(
[0] => Array
(
[0] => (Field1 = 'Val and ue1') and
[1] => Field1 = 'Val and ue1'
[2] => and
)
[1] => Array
(
[0] => (Field2 = 'Valu or e2') or
[1] => Field2 = 'Valu or e2'
[2] => or
)
[2] => Array
(
[0] => (Field3 = 'Value3')
[1] => Field3 = 'Value3'
)
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/455383.html
上一篇:如何不使用正則運算式捕獲字串
下一篇:使用正則運算式找到正確匹配的問題
