没有编号数组的PHP子模式

时间:2012-04-27 04:08:20

标签: php regex

对子模式使用preg_match始终返回具有相同数据的双键数组,一个带有子模式名称,另一个带有数字标记。因为我匹配成千上万行每行几千字节,我担心数字数组会占用额外的内存。有没有正确的方法来禁止数字标签数组返回?

示例:

<?php

header('Content-Type: text/plain');

$data = <<<START
I go to school.
He goes to funeral.
START;
preg_match_all('@^(?<who>.*?) go(es)* to (?<place>.*?)$@m', $data, $matches);
print_r($matches);

?>

输出:

Array
(
    [0] => Array
        (
            [0] => I go to school.
            [1] => He goes to funeral.
        )

    [who] => Array
        (
            [0] => I
            [1] => He
        )

    [1] => Array
        (
            [0] => I
            [1] => He
        )

    [2] => Array
        (
            [0] => 
            [1] => es
        )

    [place] => Array
        (
            [0] => school.
            [1] => funeral.
        )

    [3] => Array
        (
            [0] => school.
            [1] => funeral.
        )

)

1 个答案:

答案 0 :(得分:3)

来自php.net- Subpatterns

  

可以使用语法(?P<name>pattern)命名子模式。然后,此子模式将通过其正常数字位置以及名称在match数组中编制索引。

我看不到只按名称给出索引的选项。

所以,我认为,如果你不想要这个数据两次,唯一的可能是:不要使用命名组。

这真的是一个问题吗? IMO只有在遇到问题时才会对此进行优化,因为这会占用额外的内存! 提高可读性应该值得记忆!

<强>更新

看起来go(es)*应该只匹配可选的“es”。在这里,您可以使用非捕获组来节省内存。

preg_match_all('@^(?<who>.*?) go(?:es)? to (?<place>.*?)$@m', $data, $matches);

通过使用?:启动组,不会存储匹配的内容。我还替换了*表示0或更多,并且还将“goeseses”与?匹配,这意味着0或1。