Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不带编号数组的PHP子模式_Php_Regex - Fatal编程技术网

不带编号数组的PHP子模式

不带编号数组的PHP子模式,php,regex,Php,Regex,使用带有子模式的preg\u match始终返回具有相同数据的双键数组,一个带有子模式名称,另一个带有数字标记。因为我要匹配数十万行,每行只有几KB,恐怕数字数组占用了额外的内存。有没有合适的方法来禁止数字标签数组返回 例如: <?php header('Content-Type: text/plain'); $data = <<<START I go to school. He goes to funeral. START; preg_match_all('@^(?

使用带有子模式的
preg\u match
始终返回具有相同数据的双键数组,一个带有子模式名称,另一个带有数字标记。因为我要匹配数十万行,每行只有几KB,恐怕数字数组占用了额外的内存。有没有合适的方法来禁止数字标签数组返回

例如:

<?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);

?>

可以使用语法
(?Ppattern)
命名子模式。然后,此子模式将在matches数组中按其正常数字位置和名称编制索引

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

因此,我认为,如果您不想两次使用此数据,唯一的可能性是:不要使用命名组

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

更新

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

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

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

请给出一个代码示例,否则很难正确回答此问题。输入和输出示例将有所帮助。对于不理解我问题的人,使用示例输入和输出进行编辑。我更新了我的答案。我认为您可以通过为您的
go(es)*
使用非捕获组来节省内存。谢谢stema!虽然后者(非capturning组)与主要问题没有真正的联系,但对我来说是新事物。再次感谢!:)
preg_match_all('@^(?<who>.*?) go(?:es)? to (?<place>.*?)$@m', $data, $matches);