Php Regexp匹配任意字符串或int

Php Regexp匹配任意字符串或int,php,regex,Php,Regex,假设我们有以下字符串: $a = 'a == 1'; $b = 'b == "1"'; $c = "c == '1'"; $d = "d == 'd'"; 在以下情况下,我希望使用regexp匹配quote中的数字/元素: 如果我们没有(单引号或双引号),我们只能将(正)数字与数字匹配 如果我们有引号,我们将在引号中匹配所有内容 实际上,我的regexp是 ((?<guillemet>"|\')(?<v

假设我们有以下字符串:

$a = 'a == 1';
$b = 'b == "1"';
$c = "c == '1'";
$d = "d == 'd'";
在以下情况下,我希望使用regexp匹配quote中的数字/元素:

  • 如果我们没有(单引号或双引号),我们只能将(正)数字与数字匹配
  • 如果我们有引号,我们将在引号中匹配所有内容
实际上,我的regexp是

((?<guillemet>"|\')(?<valeur>.*?)(\k<guillemet>)|(?<valeur_numerique>\d+)) 
是否有可能简化regexp,以便直接使用
valeur
,而不占用报价?也就是说,只要一美元,就可以得到

array (
  0 => '1',
  1 => '',
  'valeur' => '1',
  2 => '',
  3 => '',
  4 => '1',
)

无需自己编写任何类型的筛选。

不要试图将所有内容都压入一个(子)模式。定义替代方案更容易。我通常会单独取消引用该值,但也可以使用
J
(PCRE2_DUPNAMES)修饰符。它允许重复的组名

$pattern = '(
  (?<literal>                
    (?:"(?<value>[^"]*)")|    # double quoted value
    (?:\'(?<value>[^\']*)\')| # single quoted value
    (?:(?<value>[+-]?\d+))    # signed integer
  )
)xJ';
    
$examples = [
    'a == 1', 'b == "1"', "c == '1'", "d == 'd'", "some == other"
];

foreach ($examples as $example) {
    echo $example, "\n";
    if (preg_match($pattern, $example, $match)) {
        echo json_encode(
            array_filter($match, fn($key) => is_string($key), ARRAY_FILTER_USE_KEY),
            JSON_PRETTY_PRINT
        ), "\n";
    } else {
        echo "NO_MATCH\n";
    }
}

无法理解您显示的输入参数与问题末尾实际询问的内容之间的联系这在很大程度上取决于您的输入。如果字符串是独立的并且是这样的,您可以尝试使用类似于
(?[“\”])(?(?:(?!\k)\D)*)(\k);(?\D+)
@AlivetoDie我已经更改了我的文本,为了更清楚一些。@WiktorStribiżew谢谢。我查看了您的正则表达式。因为在我的示例中,$a,$b,$c等是要测试的值的一部分。我需要测试的是$a,$b,$c(pregż('myregepx',$a)。使用您的正则表达式,我的数组中仍然有三个项。如果您定义了三个组,那么输出中将始终包含它们。您只需使用
array\u filter
删除空组即可。谢谢。我的问题的主要原因是为了避免对我的输出进行后期筛选。因此,您的答案没有意义,因为需要我筛选quotes。更新了答案以捕获不带引号的值。谢谢!这很好。
$pattern = '(
  (?<literal>                
    (?:"(?<value>[^"]*)")|    # double quoted value
    (?:\'(?<value>[^\']*)\')| # single quoted value
    (?:(?<value>[+-]?\d+))    # signed integer
  )
)xJ';
    
$examples = [
    'a == 1', 'b == "1"', "c == '1'", "d == 'd'", "some == other"
];

foreach ($examples as $example) {
    echo $example, "\n";
    if (preg_match($pattern, $example, $match)) {
        echo json_encode(
            array_filter($match, fn($key) => is_string($key), ARRAY_FILTER_USE_KEY),
            JSON_PRETTY_PRINT
        ), "\n";
    } else {
        echo "NO_MATCH\n";
    }
}
a == 1
{
    "literal": "1",
    "value": "1"
}
b == "1"
{
    "literal": "\"1\"",
    "value": "1"
}
c == '1'
{
    "literal": "'1'",
    "value": "1"
}
d == 'd'
{
    "literal": "'d'",
    "value": "d"
}
some == other
NO_MATCH