正则表达式:选择内的反向引用



我正在使用TDD,我必须通过一组测试来实现一个新的库:

public function providerEdgesParser()
{
    return array(
        array('.edges=(user)', false), // 0
        array('edges=test', false),
        array('another:chars', false),
        array('pl-ouf', false),
        array('test', array('test')),
        array('lang,lang', array('lang', 'lang')), // 5
        array('quest,ans', array('quest', 'ans')),
        array('q.edges=(a)', array('q' => array('a'))),
        array('e.edges=(lang,et.edges=(lang)),ans', array('e' => array('lang', 'et' => array('lang')), 'ans')),
    );
}

这是一个PHPUnit提供商。在每个数组中,第一个元素是函数的参数,第二个元素是函数必须返回的值。下面是我想出来的函数:

public function edgesParser($urlEdges)
{
      // Check if edges syntax is valid
      if (!preg_match('#^((?:(?:[a-z]+(?:.edges=(1))?),?)+)$#ui', $urlEdges)) {
            throw new Exception('Edges syntax is wrong');
      }
      // Then, use a recursive function to build the array
      // ...
      // ...
}

该正则表达式的唯一目的是检测$urlEdges字符串中的错误语法,因为它是最终用户输入。只有在此之后,我才会构建要返回的正确数组。

然而,这个正则表达式似乎不像我想要的那样工作:最近的两个测试抛出了一个异常。他们不应该。

我一直在寻找一个解决方案很长一段时间,但我只是看不出正则表达式是错误的。下面是正则表达式的图形表示。当它在被引用组内时,反向引用会不会不起作用?还是我犯了一个小错误,我疲惫的眼睛看不到?

@HamZa带来了答案。

1反向引用匹配第1组中匹配的内容。

(?1)递归掩码执行组1的模式。

第二个选项是我需要的。因此,一个合适的正则表达式可能是:#^((?:(?:[a-z]+(?:.edges=((?1)))?),?)+)$#ui(在这里分开)。

最新更新