【发布时间】:2015-05-18 17:23:08
【问题描述】:
在 PHP 中,是否可以创建动态命名的捕获组?
例如说我想将一个 dsn 解析成它的组件。考虑以下几点:
<?php
$dsn = 'mysql:host=localhost;dbname=mydatabase';
preg_match_all('/host=(?P<host>[^;]+);dbname=(?P<dbname>[^;]+)/', $dsn, $matches);
是否可以在不明确定义每个捕获组的名称的情况下获得相同的结果?
换句话说,匹配模式/;|:([^=]+)=([^;]+)/ 并使用等号左侧的任何内容作为组的名称,使用右侧的任何内容作为值。
我知道我可以通过以下方式模拟所需的行为:
<?php
$dsn = 'mysql:host=localhost;dbname=mydatabase';
list($engine, $dsn) = explode(':', $dsn);
$result = [];
while(preg_match('/;?(?P<key>[^=]+)=(?P<val>[^;]+)/', $dsn, $matches)) {
$result[$matches['key']] = $matches['val'];
$dsn = str_replace($matches[0], '', $dsn);
}
我也知道还有其他几种方法可以实现这一目标。我不是在寻找解决方法,我想知道动态命名的捕获组是否可行,如果可行,如何实现?
【问题讨论】: