【发布时间】:2021-02-16 01:04:06
【问题描述】:
假设我们有以下字符串:
$a = 'a == 1';
$b = 'b == "1"';
$c = "c == '1'";
$d = "d == 'd'";
我想使用正则表达式匹配引号中的数字/元素,在以下情况下:
- 如果我们没有(单引号或双引号),我们只能匹配(正)数字和数字
- 如果我们有引号,我们匹配所有引号。
其实我的正则表达式是
((?<guillemet>"|\')(?<valeur>.*?)(\k<guillemet>)|(?<valeur_numerique>\d+))
所以我在结果数组中得到三个键:'guillemet'、'valeur_numerique' 和 'valeur'。例如$a,我得到
array (
0 => '1',
'guillemet' => '',
1 => '',
'valeur' => '',
2 => '',
3 => '',
'valeur_numerique' => '1',
4 => '1',
)
是否可以简化正则表达式,以便直接拥有valeur,而无需关注引号?即对于$a,得到
array (
0 => '1',
1 => '',
'valeur' => '1',
2 => '',
3 => '',
4 => '1',
)
无需自己编写任何类型的过滤。
【问题讨论】:
-
无法理解您显示的输入参数与您在问题结束时实际询问的内容之间的联系
-
这在很大程度上取决于您的输入。如果字符串是独立的并且是这样的,你可以试试this regex,比如
(?<guillemet>["\'])(?<valeur>(?:(?!\k<guillemet>)\D)*)(\k<guillemet>)|(?<valeur_numerique>\d+) -
@AlivetoDie 我已经更改了我的文字,以便更清楚。
-
@WiktorStribiżew 谢谢。我看了你的正则表达式。因为,在我的示例中,$a、$b、$c 等是要测试的值的一部分。我需要测试 $a, $b, $c (preg_match('myregepx', $a)。使用您的正则表达式,我的数组中仍然有三个项目。
-
如果您定义了三个组,您将始终将它们包含在输出中。您可以简单地使用
array_filter删除空的。