如何只返回带有preg_match或preg_match_all的命名组?

rsk*_*k82 15 php regex preg-match

例:

$string = "This is some text written on 2010-07-18.";
preg_match('|(?<date>\d\d\d\d-\d\d-\d\d)|i', $string, $arr_result);
print_r($arr_result);
Run Code Online (Sandbox Code Playgroud)

返回:

Array
(
    [0] => 2010-07-18
    [date] => 2010-07-18
    [1] => 2010-07-18
)
Run Code Online (Sandbox Code Playgroud)

但我希望它是:

Array
(
    [date] => 2010-07-18
)
Run Code Online (Sandbox Code Playgroud)

在PHP的PDO对象中,有一个选项可以通过删除这些重复的编号值来过滤数据库中的结果:PDO::FETCH_ASSOC.但我还没有看到PHP中PCRE函数的类似修饰符.

hak*_*kre 11

preg_match没有任何标志或选项,它只返回命名匹配(尚).所以你想要的不是直接的.但是,您可以从匹配数组中删除所有带有非拟合键的项目,然后获得您要查找的内容:

$matches = array_intersect_key($matches, array_flip(array('name', 'likes')));
Run Code Online (Sandbox Code Playgroud)

演示


Jen*_*och 11

如何只返回带有preg_match或preg_match_all的命名组?

这是目前(PHP7)不可能的.您将始终获得包含数字和命名键的混合类型数组.

让我们引用PHP手册(http://php.net/manual/en/regexp.reference.subpatterns.php):

然后,此子模式将通过其正常数字位置和名称在matches数组中编制索引.


要解决此问题,以下代码段可能会有所帮助:

1.使用数组键上的is_string检查过滤数组(对于PHP5.6 +)

$array_filtered = array_filter($array, "is_string", ARRAY_FILTER_USE_KEY);
Run Code Online (Sandbox Code Playgroud)

2. foreach over the elements and unset if array key is_int()(所有PHP版本)

/**
 * @param array $array
 * @return array
 */
function dropNumericKeys(array $array)
{
    foreach ($array as $key => $value) {
        if (is_int($key)) {
            unset($array[$key]);
        }
    }
    return $array;
}
Run Code Online (Sandbox Code Playgroud)

它是一个简单的PHP函数命名dropNumericKeys().它用于在preg_match*()使用命名组进行匹配的运行之后对匹配数组进行后处理.这些函数接受了$array.它迭代数组并删除/取消设置整数类型的所有键,保持字符串类型的键不变.最后,该函数返回带有"now"的数组,只有命名键.

注意:该函数用于PHP向下兼容性.它适用于所有版本.该array_filter解决方案依赖于常量ARRAY_FILTER_USE_KEY,仅在PHP5.6 +上可用.见http://php.net/manual/de/array.constants.php#constant.array-filter-use-key

  • 该函数用于PHP向下兼容性.它适用于所有版本.`array_filter`解决方案依赖于常量`ARRAY_FILTER_USE_KEY`,它仅在PHP5.6 +上可用.见http://php.net/manual/de/array.constants.php#constant.array-filter-use-key (2认同)

Mae*_*lyn 4

我不认为你能做到preg_*这一点,但你可以用一个简单的循环来做到这一点。但我不明白为什么这些元素会造成问题。