有没有办法使用对先前捕获组的反向引用作为命名捕获组的名称?这可能是不可能的,如果不是,那么这是一个有效的答案。

以下:

$data = 'description: some description';
preg_match("/([^:]+): (.*)/", $data, $matches);
print_r($matches);

产量:
(
    [0] => description: some description
    [1] => description
    [2] => some description
)

我尝试使用对第一个捕获组的反向引用作为命名捕获组 (?<$1>.*) 告诉我这是不可能的,或者我只是没有正确执行:
preg_match("/([^:]+): (?<$1>.*)/", $data, $matches);

产量:



想要的结果是:
(
    [0] => description: some description
    [1] => description
    [description] => some description
)

这是使用 preg_match 简化的。使用 preg_match_all 时,我通常使用:
$matches = array_combine($matches[1], $matches[2]);

但我想我可能比那更狡猾。

最佳答案

简而言之,这是不可能的,您可以坚持迄今为止一直使用的编程方式。

组名(应该是 consist of up to 32 alphanumeric characters and underscores, but must start with a non-digit )在编译时解析,反向引用值仅在运行时已知。请注意,这也是您不能在后向引用中使用后向引用的原因(尽管您清楚地看到 /(x)y[a-z](?<!\1)/ 是可以的,但是 PCRE regex engine sees otherwise 因为它无法通过后向引用推断后向引用的长度)。

关于php - 使用先前的反向引用作为命名捕获组的名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48816763/

10-08 20:43