如何从 preg_match 中仅获取命名捕获? [复制]

Posted

技术标签:

【中文标题】如何从 preg_match 中仅获取命名捕获? [复制]【英文标题】:How can I get only named captures from preg_match? [duplicate] 【发布时间】:2011-12-31 18:20:28 【问题描述】:

可能重复:how to force preg_match preg_match_all to return only named parts of regex expression

我有这个sn-p:

$string = 'Hello, my name is Linda. I like Pepsi.';
$regex = '/name is (?<name>[^.]+)\..*?like (?<likes>[^.]+)/';

preg_match($regex, $string, $matches);

print_r($matches);

打印出来:

Array
(
    [0] => name is Linda. I like Pepsi
    [name] => Linda
    [1] => Linda
    [likes] => Pepsi
    [2] => Pepsi
)

我怎样才能让它返回:

Array
(
    [name] => Linda
    [likes] => Pepsi
)

无需对结果数组进行过滤:

foreach ($matches as $key => $value) 
    if (is_int($key)) 
        unset($matches[$key]);

【问题讨论】:

可以使用T-Regx库,也可以使用namedGroups()方法。 【参考方案1】:

preg_match 将始终返回数字索引,而不考虑命名的捕获组

【讨论】:

【参考方案2】:
return array(
    'name' => $matches['name'],
    'likes' => $matches['likes'],
);

某种过滤器,当然。

【讨论】:

foreach($matches as $k =&gt; $v) if(is_int($k)) unset($matches[$k]); 剥离数字键并仅保留已命名的键。 现在 (php 5.6+) $matches = array_filter($matches, 'is_string', ARRAY_FILTER_USE_KEY); 是实现相同目标的更简单方法。应用“is_string”作为键的过滤器。

以上是关于如何从 preg_match 中仅获取命名捕获? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中仅捕获某种类型的 ValueError?

从网络摄像头捕获帧,它在 opencv cv2.VideoCapture() 中仅返回 1 帧

如何从json中仅获取数字键值对

如何从数据中仅获取访问令牌

如何从核心数据中仅获取第一个实体?

如何从日期时间 C# 中仅获取时间 [关闭]